{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import paddle\n",
    "import paddle.fluid as fluid\n",
    "from paddle.fluid.dygraph import Linear\n",
    "import numpy as np\n",
    "import utils\n",
    "\n",
    "import matplotlib\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython import display\n",
    "from PIL import Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_line(costs, learning_rate):\n",
    "    \"\"\"\n",
    "    动态绘制训练中costs的曲线\n",
    "    :param costs: 记录了训练过程的cost变化的list\n",
    "    \"\"\"\n",
    "    plt.clf()\n",
    "    plt.plot(costs)\n",
    "    plt.title(\"Learning rate = %f\" % (learning_rate))\n",
    "    plt.ylabel('cost')\n",
    "    plt.xlabel('iterations')\n",
    "    plt.pause(0.05)\n",
    "    display.clear_output(wait=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_data():\n",
    "    \"\"\"\n",
    "    使用参数data_creator来获取测试数据\n",
    "    :return: 训练数据集，测试数据集，数据维度\n",
    "    \"\"\"\n",
    "    # 获取原始数据\n",
    "    train_x_ori, train_y_set, test_x_ori, test_y_set = utils.load_data_sets()\n",
    "    # m_train: 训练集样本数量\n",
    "    m_train = train_x_ori.shape[0]\n",
    "    # m_test: 测试集样本数量\n",
    "    m_test = test_x_ori.shape[0]\n",
    "\n",
    "    # 定义输入数据维度\n",
    "    DATA_DIM = 2\n",
    "\n",
    "    # 转换数据形状为\n",
    "    train_x_flatten = train_x_ori.reshape(m_train, -1)\n",
    "    test_x_flatten = test_x_ori.reshape(m_test, -1)\n",
    "\n",
    "    # 归一化处理\n",
    "    train_x_set = train_x_flatten / 1\n",
    "    test_x_set = test_x_flatten / 1\n",
    "\n",
    "    # 合并数据\n",
    "    train_set = np.hstack((train_x_set.T, train_y_set.T))\n",
    "    test_set = np.hstack((test_x_set.T, test_y_set.T))\n",
    "\n",
    "    shape_X = train_x_set.shape\n",
    "    shape_Y = train_y_set.shape\n",
    "    print('The shape of X is: ' + str(shape_X))\n",
    "    print('The shape of Y is: ' + str(shape_Y))\n",
    "\n",
    "    # 绘制原始数据散点图\n",
    "    plt.figure(\"data set\")\n",
    "    plt.scatter(test_x_set.T[:, 0], test_x_set.T[:, 1], c=test_y_set[0], s=40, cmap=plt.cm.Spectral)\n",
    "\n",
    "    plt.title(\"show the data set\")\n",
    "    plt.show()\n",
    "\n",
    "    return train_set, test_set, DATA_DIM\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The shape of X is: (2, 320)\n",
      "The shape of Y is: (1, 320)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEICAYAAAC6fYRZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOydZ3gU19WA3zuzTb1TJIoEiN4RzXRjinsjcY9LPjux05zELbETl7jFdhzbibtjx51gg6mmmt57F0UgIYEQQr1vmbnfjxVCYndVV0jI8z4PD9qdmXvPrFZnzj33FCGlxMDAwMCgbaK0tAAGBgYGBs2HoeQNDAwM2jCGkjcwMDBowxhK3sDAwKANYyh5AwMDgzaMoeQNDAwM2jCGkje4aAghnhFCfNHCMsQLIaQQwtRM40shRI/mGNvAoDEYSt6gTSOESBNCXNHSclxIcz9sapl3ohDi5MWc06BlMZS8gYGBQRvGUPIGfkcI8bgQ4pQQolgIcVgIMbnaYYsQ4rPKYweEEEnVrusjhFgthCioPHZd5fsJle8pla8/EkJkV7vuCyHEw17k+BzoAiwQQpQIIR6rdvgOIUS6ECJHCPFktWsUIcQTQohjQohcIcQsIURkLff6qBDitBAiUwhx3wXHrhZC7BJCFAkhMoQQz1Q7vLby/4JK2UYLIboLIVZWzpsjhPhSCBHuY14hhPinECJbCFEohNgrhOhfecwqhHit8v7OCCHeE0IECCGCgMVAbOWcJUKIWF/3ZtBGkFIa/4x/fvsH9AIygNjK1/FA98qfnwEqgKsAFXgJ2Fx5zAykAH8GLMDlQDHQq/J4OjCs8ufDwHGgT7VjQ3zIkwZcUe11PCCBD4EAYBBgrzbWw8BmoBNgBd4HvvYx9nTgDNAfCAK+qhy7R+XxicAA3MbUwMpzb7hADlO18XoAUyrnjcH9IHjDx9zTgB1AOCCAPkDHymNvAPOBSCAEWAC8VE2mky39PTH+Xbx/hiVv4G803EqqrxDCLKVMk1Ieq3Z8vZTyeymlBnyOW8kCjAKCgZellA4p5UpgIXBb5fE1wAQhRIfK199Wvk4AQoE9DZTzWSlluZRyT+W15+T4BfCklPKklNKO+8E0w4fv/KfAJ1LK/VLK0spzq5BSrpZS7pNS6lLKvcDXwARfAkkpU6SUy6WUdinlWeD1Ws534lbgvQEhpUyWUp4WQgjgfuD3Uso8KWUx8CJwaz0+E4M2yEXd9DFo+0gpUypdJ88A/YQQS4E/SCkzK0/JqnZ6GWCrVKCxQIaUUq92/AQQV/nzGuA64CRuC3c1cBfulcG6C66rDxfKEVz5c1fgOyFE9fE0oD1w6oIxYnFb09XlrUIIMRJ4Gbelb8H98PvGl0BCiHbAW8A43ApcAfK9nSulXCmE+DfwNtBFCPEd8AhgAwKBHW597x4a98rJ4EeIYckb+B0p5VdSyrG4FaYE/l6PyzKBzuf87pV04bxiXYNb+U2s/Hk9MAa3pbumNnEaJLzb1XSllDK82j+blPJCBQ9wGuh8gbzV+Qq326SzlDIMeA+3wvUl10uV7w+UUoYCd1Y73wMp5VtSymFAP6An8CiQA5QD/arJHyalPPcQM8rO/sgwlLyBXxFC9BJCXC6EsOK2sstxW8J1sQUoBR4TQpiFEBOBa4GZAFLKo5Vj3QmslVIW4fZx30ztSv4M0K0Bt/Ae8IIQomvl/cQIIa73ce4s4B4hRF8hRCDw9AXHQ4A8KWWFEGIEcHu1Y2cB/QLZQoAS3JuxcbiVtleEEMOFECOFEGbcn1sFoFWuaD4E/lm5MkAIESeEmFZ56RkgSggRVsfnYNBGMJS8gb+x4nZR5OB2ibTDvZlaK1JKB253zJWV174D/ExKeajaaWuAXCllerXXAthVy9AvAU9VRuc8Ug/538RtfS8TQhTj3oQd6UPmxbg3OVfi3jReecEpDwHPVY7zV9wPhXPXlgEvABsqZRsFPAsMBQqBRcCcWuQMxa3M83G7iXKB1yqPPV4pz2YhRBGwAveGOJWf59fA8cp5jeiaNo6Q0li9GRgYGLRVDEvewMDAoA1jKHkDAwODNoyh5A0MDAzaMIaSNzAwMGjDtKpkqOjoaBkfH9/SYhgYGBhcUuzYsSNHShnj7VirUvLx8fFs3769pcUwMDAwuKQQQpzwdcxw1xgYGBi0YQwlb2BgYNCGMZS8gYGBQRvGb0peCKFWNkhYWPk6QQixRQhxVAjxPyGExV9zGRgYGBjUD39a8r8Dkqu9/jvwTyllIu76Gj/341wGBgbNQEmRnU1rU9myPo2yUkdLi2PgB/wSXSOE6ARcjbvg0h8qGxdczvmqe5/iri/+rj/mMzAw8D/LFx3if//diWpyVzfWNck9D41izMSGFPE0aG34y5J/A3gMd+lUgCigQErpqnx9kvPNH2oghHhACLFdCLH97NmzfhLHwMCgIRw7cpZZn+3E6dSoKHdRUe7C4dD45J3NnD5V2NLiGTSBJit5IcQ1QLaUsnqHHG+NDryWu5RSfiClTJJSJsXEeI3lNzAwaGZWLDqM0+FZ9l/TdNYsT2kBiQz8hT/cNWOA64QQV+FuPRaK27IPF0KYKq35Trg7/xgYGLRC8vPK8FZ1XNck+bllF18gA7/RZEteSvknKWUnKWU87mbBK6WUdwCrgBmVp90NzGvqXAYGBs3DgCGxWCyebWCtNhP9BndsAYkM/EVzxsk/jnsTNgW3j/4/zTiXgYFBE5g4NZGAIAuKct7TajIphIXbGDU2vuUEM2gyraozVFJSkjRq1xgYnCf3bCn7d2ditqgMTupEYFDzpZsU5JUx6/Nd7NySgSIEI8fFc/PtgwkOtTbbnAb+QQixQ0qZ5O1YqypQZmDwYybrVBH7dmVitqoMHdGJJfOSWbbgEIoCQgg+0TfzwMNjGH5ZV7/O63LpFBdVEBxi5YHfjfHr2AYtj6HkDQzqwZ4dp5g7cw/ZWSV0iAvlptsG0W+Qf3zVUkq++HAba1akgJQIRfDZ+1sRuBVwdd5/YwPde8UQGRVY55iaJjGZfHtkpZQs/HY/C+ccQNfc80yclsgtdw+r9TqDSwtDyRsY1MHaFSl8/uFWHHZ3iGHKobO88eIq7vvVaEaPT2jy+Du2ZLDuh2NeQxgvRErJpjXHufqm/l6Pa5rO3Jl7Wb7oEBXlTqJigrjl7qGMGBPvce7C2QeY/+2+qvsCWL30KPYKF/f9anSj78egdWE8rg0MasHl0vn6kx01FCGAw67x5UfbqizgprB84SHsdlfdJwIup05Rod3n8Y//vYkl8w5SXuZESsjJLuXDNzeyZX1ajfM0TWfRnP2e9+XQ2Lg6lZJi33MYXFoYlryBQS1kny5G86HI7XYXuTllxLQPJj0tn8XfHSAzo5Au3SK56sa+dIwLq9ccDakRY7WZ6DOgvddj+XllbFmfhtNZU16HQ2PWZ7sYWS1KpqTYjsvp/b5MZoXsrGKCQ4wN17aAoeQNfvTkni3l0IEzBASaGTAkFrP5fLx4YJDZp7Wua5KAQDO7t5/k7VfX4nRoSAlpx/NYuyKFCVN6cM8vR6Ko5xfMpSUOtm06QUmRnZ592pHYJ4ZBSZ3IPFnoVekKQVWSktmsENspjAGDO3L0UDbHDucQGm5j2KguWK0mMtLyMZlVDyUPkJNdgqbpqJWyBF0QLlkdl1MnKiao3p+fQevGUPIGP1qklHz50XZWLTuCqioIIRACfv/kJHr1c1vL4ZGBJPSIIuVwDrp+PtxYUQW9+7cnMNDMR//a6OH2AFizPAUh4N6H3P7tA3tO8+aLqwFwOjXMFpWEHlH84vdjWLv8KCXFdjTNPYfZotKpSzixncPYs/0kJrPKuMk9mHZtb/7+9ArSUvLQNB2TSeGz97fy6DOTiYwK9LnqCAg014yBN6tMvqonK74/XEN2s1llUFIcYeEBTfpsDVoPhpI3+NGyaW0qa1ek4HLqNazo159fyesf3cy6H1JY/N1BCgvKUVQFs0lBSgnS/YDIOlXEZx9uxVHhe8N0/cpj3Hz7YKwBZt56eXUN37u9wsWxIzmsWZ7Cc/+8hgXf7GXH5gzMFpUJUxKZdl2fGqsKgJn/3cHxIzlV1vq56JvX/7aKNz+ZQce4MDLS8ms8kCxWlanX9MZdHPY8M+4cQkWFi3UrUtwrAIdG/8EdeeBhI4yyLWFsvBr8aFky96DXDU8p4e1X1zD7y90U5JcjJWguHV3TMZtVNF1H0yQ5Z0tZt+JYrZumiqqQcaKAvTtOeT3udGgs+GYfS+cnc+2MATz06HiCQ6zM/nI3v7v3W775fBcu5/mHyNoVKV7dMS6XTvK+LP7wl8vpkhCBxaoSEGjGZFYYOTae628ZWOP8LevTeOrhhWxcdZywyEDUSit/365MXn16BWfPFNfrMzRo/RiWvMGPluIi7xEkdruLg3vOcGE2uKZJysucNd67MI79QlxOnYjIQPJyvBcAOzfusgXJ/LD4MLouq0IpS0scLF2QTMaJfH716Hi+/GgbpSW+N2nLSh2ERwTwuz9NZOGcA5w5XcygYbFMnNqzyhcPsGjOfr6bubdqnoqKkhrjpBzJ4bnHl/CP92/EYjVUxKWO8Rs0+NHSu397Nq5J9TwgQXqvjN1gzBaV2M5hmC1qreGWLpfu9YHhdGjs35XJw/d9S0W57xWDy6URGR3InK928/13B5FIXE6do8nZLJ2fzNOvXoXVqvLx25vYvO5ErTJLXWIvd7F14wnGTuru+zwp2b4pncVz3S6tXv3ac91PBtAhNrTW8Q0uLoaSN/hRUlbqIDjU1uzzDBneCYCY9sFMmJLIuh9qd+94Q9MkZaVOn8ctVpWwcBsv/2W5R4SOvcKF06Ex85MdFBaUc2h/Vr3mtNtdnEwrqHpdUmRn3coU0lPz6RQfwfjJ3VkyL5nlC5OxV27c5uWksmNzOn95eTqdukY06B4Nmg9DyRv8KLDbXezflYnDoRHdLog3XlhFRUXDlG1j2LbpBPFzIxl/RQ/uvH84PXrFMGfmHrKzin200Wk43RKjSTmUjcvlfUBdl2xel4qiKj7P8YYtwK0eMtLyeeHPS9FcOg6HhmVTOvNn7cXp1NGqrT50XVJR7uLrT3bw6DNXNO2mDPyGoeQN2jx7tp/i7dfWuqNLpMRud/n0j/sbzSWZ9dkuZn+1h5/eNYSp1/Zh2Ogu/ObuWR7ul+ox8fUlPDKAY4dz6lTemiYxWxSc1F064RwxHUIAeO+f62vsRTgqffnCe5g9hw6cqfccBs2PEV1j0OaQUlb5vwvyy/n3K2uwV7ioKHdSUdE4BW8yC59KrS7ObaZ+88UujiRnY7GoTJya6HGer+QkX1isKlOu7uUzNv5CKsp9u3wuxGxW6JoQQUFeGVmZRV7P8fU5WiyG7diaMH4bBm2GinInX3+ygw2rj+N0anTuGkFinxhcfqgvEx4eSGFhOU5H48dyODSWLThEXOcwflh8xPMEUX9r3mxWmDS9J5Ov6sU3n+9utExCgFAEunZ+UpNJoXN8BBtWu33sWh0RRDXlUhk/2fdmrcHFx1DyBi2GrumczS4lINBMaFjTNkGllLz6zArSjudVbT5mpOWTkZbvD1ERCqiqipMmPDAkZKTl8f13B7xa7ZpLYjIraC69TkWv65IVCw+xZV0aigJ6LWLV9uDonhhN0piuzJ25t7I8sU7vfu05cTyP9NTkWkNEQ8NtOCpdX06HC7PFRFyXcG66fRC6Ljl84AzZWcXEdQmne89oj2SsczjsLpYvOsT6lceRUjJ6fAJTr+tDQIC59g+hiZw8kc+xIzmEhQfQf0hsmy2vbCh5gxZh87o0vvhwKw67C02TdO8Vw4N/HEtE5Pk66aUlDmZ/uYtNa9PQNJ1Bw+K45e6hRLcL9hgv5fBZMtIKfBbdaiplpc5a3R1CEaiqQFUVdE33mrAE7qqQS+YfqpHgVB2LxYQaKKgod9Vaevhc+YOCvPJa5TaZFUJCrOT7OC80wsaV1/dlylW9yMkuJTjUnYiVvC+rao4LUVSB2aTy0B/HEd89km0b0ynMLychMcpdo37OAVYvPUp5uQNNk0hdYjKr3HTbIKZe0xtTtSxel0vnxSeXcSq9oMrXv2D2fjavT+PZ165qljh9l1Pj36+s5cCe0yDcbjKzWeWxZ6+gS0Kk3+dradrmo8ugVZO8L4v//HsjxUV27HYNl8sdz/3Cn5ZW+dJdTo2/PbGYNctTKCt1YK9wsW3jCZ7+4yIKCzwVVmpKLlpt5mwdKJ49rGtQWxJSt55RdOsRyaRpiTz/xjX88enJhEcEoKqelqvLpftU8IoqGDGmC0++OA1rQ5WbFyPZalV55tWruOLqXpi9NOkGOHwgm8VzDyAUQYe4UIJDrOzYku5VwQsBEZEBxCdEcvmVPYmMDiIg0ML4K3owYGgs776+jn/8bSXzZ+2jqLACp0NH12Slpa/xzee7ePXZH2rkC2zdkMapjMIqBQ/uc3OzS9i45njDPoN6Mv+bfRzYcxqHQ8Nh16god1FcZPeQra1gKHmDi853M/d4FPTSdUlxUQX7dp8G3I008nLKargLpISKChfLFx7yGDMyOsibnqsXiiIavVmoKJB+PJ/UlFxWLTnKn3+zgFMnCnjhrWsZN7k7tgBzvTZszZUW9423DuKLD7dRVlb/8sOA13BMu13j43c2MXFKT6xWk1c5SksczPl6D2+/upbMjEL+8vuFFOZXeJ1CCEFRYQXHj+WydEEyT/52AUvmH8Tp1Hjl6RWUFDmQtehIXZekHs1l765MdE1n9pe7+PDNjTi85A3Y7RrbN2XU9+7RdemRoeyLH5YcqfFQOYfD7iJ5f9uLDDLcNQYXndOnvEdruJw6p08VMmhYHMn7s7B7iWN3OXUO7DnNjDuHUFpip7TEQWR0EIOHxSEaGJ1yjnPx3Y27FvTKFcS5/2d+upMBQ2O596HR3PvQaH5337de3SqKAh07hREQYGbg0DgmX9ULIQSH9p+psRHaFI4fyWX594cYOCyWTWtTvT4MHHaNvTtOcXBvFuW1uKSqFz3TNYmuaXz7xW4UIXC56heaabe72Lklg4N7s1i19EiNMS8kMKhun3x6Wj5ffLCVI8nZqKpC0mVduPP/hhNSS6JbRZnve2yLzVIMJW9w0ekQG0pRgae1aDIrdIx1N9qIiAzEZFa8+thDQq288eIq9u3MRFUVVJPCjDuHcPt9Sfz33S3NLn9d6JrOpjWp3HDrIAASe8ewfVO6x+an2azys1+MpHe/801ATp4oaHCIp3JuU9iHG2jh7H2AqNXK1rTKzV4vc9e2cet0aOzdecqn/95jLMVd6mHlkiO17jlYLCo9+7bj5b8sJ+1YLmHhAVx1Y1+GjuzM1vUnKCwoJzommC8/3lb1gHa5dLZtOMHxIzm89O/rfW6kdkuM4kjyWY/3NZdOj14x9bqPSwnDXWNw0bnhloFYrDV9xIoiCA6xMmCIuzl20uguXhWL2aKSfaaUfTszcbl07HYXZaUOvv5kOwGBZrokRHj1hV9MNF1SVs1aHDGmq9d70XVJYq/oqtc7t2bwzCOL6h33XjWO9J2YBOByyjrDIIUQPiNpQiNqj3zat+t0vTe8zSaV3v3b1yiY5g2HQ+OLD7eRvC+L8jInWZlFfP7BVn5377d8+fF25s3ax3/e3uSxAtM0SVFhBTu3+Hb13Hpvksf3z2JVuWxitzbZLMVQ8gYXnX6DOjLt2j413pNSEt8jCoQgM6OQF/601Ou1LpdGzpliD4XkdGh88dE2/vziNCZNS2x04pI/sFpMDE6Kq3rttQga7gfb/t3uWjJFhRW8+9o6n1E5tWGzmRg9ofaG4nWtDoTAQ/G53xfEd4vyS3ihEDB0VGcSekTXy71zocxOp7vEc10PrIpyd51+X3TvGc2fX5hGv0EdCAg0E9M+mFt+NpR7HhxVr/u41DDcNQYXnfJyJ8su2DyVEvbtyGT1siOsXHKU0lKHV9eB1MHpI4qmuNDOt5/vorjIzrjJ3dm0Nq1Wl0BtmMwKYyd1Y8Oq4z4Vr2oSaF7KCQQEmukzoEPV6xPH87xe73TqZJzIZ1BSHNs2nGhSKZsJU3pw+mShVzdEffjNExP54I0N7g3JaoJIKTmw+zS6H+pACCHYve0kO7dkkNAjirRjeY3+/dSGxaISFRNY6zkJPaJ47Nkpfp+7NWJY8gYXnZ2bvS+l7XYXs7/czemThY0u3vXD4sNsWX/CrZyr11hpgGVvsaj87k8Tufeh0Tz23BS6JETUWBkIRWC2qD6Te4qLKmr4qGO8xPWfmye6nds9UFrq8BlaWRdWm4mEHtH84S+X06N3jFeLvK7rByd14smXphEb51km2OXSQcomW/PnNrgddo3UlFz6DKjbbdMYhCK4bHw3v497qWIoeYOLTmmJ3eeSu6TYUWcjjto4Z3BWV7JSunV8XdE3YeE2+g/uyOPPTWHgULe7pWefdvztn9fw+HNT6D+kI+07hjBybFfueXCkR2u+6vNVV9jX/mSAp+IV7v2FoSO7AO7a9vUN41Qrla3FomKzmfjt4xNRFEFAoIW/vDydPz0/td77EiaTwujxbldPXOdwRo5LQDV5XqvrENs5tMEPEF9ICV3iI+kQG+KX8cxmBVuAmeAQK4/8dTLBoVa/jNsWMNw1Bhedbj2jm6TIG4OUYDErXuOjz/HXV670mk0L0GdAhxoumIpyJ5/6iORp1yEYW7WU/AFDYrn+loHM/nJ3VWhkYKCZh5+chKUySSmxdwyJfWI4cjDbo8qj2aKiqgoup8bIcfH0HdCBtON5xLQL5rIJ3TwUWrfEaMZM7MbGtaleN0RNJgWXS8dqMxERGchP7hpSdexsVrFXFxSA1Wrm9Q9v4uGfz25yZrHm0snPLaMgv/aM3fqiqAp33j+cyyYkNMvq4FLGUPIGF50zp4tRFFFrjHRz4HRqBASZKffSgENVBetWHuPGyrDHurAFmLnx9kF893XNxC6LReWuB0bUOLe0xMHyhYdqJOtUVLj44I0NPP/mtVgqXT+/f+pyli1IZtXSI1RUuBg8LI7rbxlIcZGdwvxyunSLJDLK7WseU0vHJoDbf57EidR8sjKLcDk1zGYV1aTw4B/HkpqSS15uGb37tSdpVJcaZQYS+7Zj28Z0j8YmJrNCr37tCAm1cd+vRvPJO5vdfW8b+Tu0WFXiuoSRnVXM0UON20eojt3uYu7MPYydZLhpLsRQ8gYXncMHztRLOVgs7thv/9V+F0THBJFRWuBxRNMkRV7KJdTGVTf0o137EOZ/s4+8nFK6JERw0+2DPWKtVy8/SmlJzWxQXZMU5JezdX0aYy93K2yTSeGqG/tx1Y39alzva3VRGwGBFp79x1Uk78si7VgeEVGBDBvZGYvVxIAhcT6vGz0+gbkz9+J0alW/IyHcv4spV/cGYMzEbiT2jmH9ymNsWZ9KVmaJz/HAvRK58IHgsGt8N3MPNpsZRRU+k7+EAKvNjK67r/e5gpDunr2pKbl0S4z2fs6PFEPJG9Qbd4Pr00gJfQa0JyDQ0qhxoqKDfCY6nUNVBaPGJ7BxzXG/FR2TUlYWo1I8ImZsNhN9B3Zs8JhJo7uQNLpLrefs23nKaxSJvcLFvt2ZVUre3wgh6DuwY4Puy2o18cyrV/L5h9vYtTUDXULfAR2464HhhFcrHteuQwg33T4Yp1NjyfzkWjN0R4zpitQlO7Zk1Mhidjp0nA47ig/viqIIRo9PYOS4ePLzyvjms52UOH2Xe1AUQVlpA8tB/AgwlLxBvdi68QQfvbkRRRFIJLomuev+4Yyfkojd7mLj6uPs25VJeEQAE6f1pEu87x6fYy/vzsI5+2udT9Mk4y7vRk52CYcPnKl3RmVdZKTlExxiRSt2VFmWJrNCTIdgho7s7Jc5LiQ8ItBr1qiiCsIjApplzqYQHhnIbx6fgJTu4mK1NTMZd3kPli86jK553+uw2UwMGBLL6PEJzP9mH/Nn7fPIzNV1CIuwUV7qrNqPUFUFW6CJm+8YTFRMEFJKPnl7c61yu1w6CT0MK/5CjB0KgzrJyiziwzc2YLe7KC93usPgHBqff7SNg3uzePK3C/j64x3s2JzBqqVH+Ntji1m97GiNMVxOjeR9WezfnUlwqJVfPToeW4CpxgblhXz45kYe/MNYOnYKw2ozYbU13SaREh59ZgqXTUwgKNhCaLiNKdf05smXpjfbht0VV3mvAmlSFSZM8ewQ1VoQQtTZrSq2cxi33TsMk5eIHFVVCA23Va10TqYX+Cy9UJhfwY23DaJ7z2jax4Zw+ZU9eeHNa6syUH2Fq56fS3Dtzf0JCj6/utQ0nR2b01k0Zz/bN6df9M3+1oJhyRvUyerlR72m2judOp+9v4X83PPVInW9MiX9o20kje5CcIiVfbsyeee1tei6O5RR1yV3/3Ik//r0p8z5cheL5yV7nTf7TAlbN57gudevJvVoLlmZRcz+cjd5uWWNvhfVpNCpSxj3/3ZMo8doKD16xzDjjsHM+nwXJlUB4V6p3P3gSGI7hV00OZqLyVf2YtjIzqxadpQt69M4k1mMalIYMaYrt907rCrUtGu3SLZuOIH0sR+Tn1vGX1+50uc8YeE2Cr3UPAK47b6kqj0DgLycUp7/01JKS+w47BoWq0pAoIWnXprWqD2OSxlR3/KcF4OkpCS5ffv2lhbD4ALeeW0dW9anNegaq83EPQ+OpFff9jzx63kepYVV1R3XXV7mqNUVYzYr9O7fAZNZISMtHymhIK/M6zWqSXD9TwcSFm7jk3e8hzdec3M/fnLX0Abdi78oKqxg385MFFUwcGhcDavzx0BJkZ3f3PONz033UePiefCP43xef3DvaV55eoWH22vIiE48/OdJNd578c9LOXrobI25hCLo1iOq1gfJpYoQYoeUMsnbMcOSN6iTPgPas3vbSY+wurqQOqxdcdTrppymyXqVdXU6dfbtyvR4v3oIplDcWaW/fmwCXbu5O/uoJoX//GtTDYUwZmJCiyl4gNAwG2N+xCF+waFWpl3Xh8VzD3ocs9pMVQlovug7sCP3PjSKT97ZXPV7VRQoL3P78s/lHBQVVnDsSI7Hw0TqkvTUPPLzyigttrN14wl0TTJsVBcSekTV639KiY4AACAASURBVB4yTxaSfbqYjp3CaN/RP4lczY2h5A3q5LIJ7k0zl0ur9waorukMHBbLVx9nNosvVFEFMR2CCQg0M/nKXoyd1L2G/3jc5T1IGt2V/bvc8w8cGktQsBVd09ElbbafZ2vn+p8OYOv6E+Tnl1U9/E1mhajoIEaM7epxvqbpKIpACEHK4bN8+t6WGg9uXYdjh3OYO3MPP/2Z+wFur3ChqAK82CS6hDlf7Wbz2jRcLh0pJUvmHyS+exRlJQ7Kypz0H9SR628ZSEz7YKSU7Np2khWLDnP8aA4OuwuL1YTLpdNnQAd+/dj4hnfxusgY7hqDelFYUM7//ruTTWtTa41xF8JtRd96zzCmXN2bVUuP8OV/tvu9EJXNZuLJl6fXGsVTncKCcj59bwu7t51El9CtRxR3/3JkleVvcPEoLqpg7sw9bN2YjiIEoycmcP1PBtQIyU3el8UXH23jVHoBJrPKoKGx7N5+yqfBEBRi4Z3PbwHcez4P3/etT/99bfXxwb1KtAWYePYfV7Nw9n42r0vz2sDGbFYZObYr9//u4u3v+KI2d02TlbwQojPwGdAB0IEPpJRvCiEigf8B8UAa8FMpZX5tYxlKvvXz6XtbWLXsqM/NM0UBRVEIDLIwZlI39mw/SeZJ752gmoLZovLSv64lpn3tS2ZN01n7QwpffLDNQ0FYbSaef+Ma2nW4NJbdPxZSDp/l739ZXrMEhaDWonUmk8J/vr2j6vX2TSd49x/rG72KFAL6D4nl8IEzHvtJ1TGbFd7+/KdYbXV3sWpOalPy/lizuoA/Sin7AKOAXwkh+gJPAD9IKROBHypfG1ziTJyaiLkWV4euu+OViworWDz3YLMoeCGgQ8eQOhW8lJK3XlrNFx9s9frH7nRqLJpzwO/yGTSNb7/Y7VljqA5btN0F/vGk0V3pO7CDj7PrRkp3ZnZdlUGFEJSWOKgod3LieJ7XJvMtTZOdSVLK08Dpyp+LhRDJQBxwPTCx8rRPgdXA402dz6Bl6dotkhl3Duabz3chFIGUNEtN8Aux2kw47C6sVhMWq4lfPz6hzmsO7T9D8v4zuHwU3NI1ScrhptdNMfAv6ane6+/Xhs2LJd3UUElLZTmG2p4wqklh+aJDrFh0GEVVcLk0+g/qyC9+P5bAoNYRPeXXHQMhRDwwBNgCtK98ACClPC2EaOfjmgeABwC6dKk9PdygdTDtur6MHBvPrm0nycspY+mCg9grmk/Rh0fauPP/RpB5spD2HUMYNqqLzzK/1dlVV0SQwHDVtELCIgIoLWlYeYLs0+4Vo93uYvWyo2xZl0ZxkXeffH2wWFQmTklk6cJDaD6yeS1WdyvDFd8frlx5uM/bv+c0/35lTatpSuI3JS+ECAZmAw9LKYvqylA7h5TyA+ADcPvk/SWPQfMSHhnIpGk9cdhdLJ3vGRLnT0aPS2D4ZZ6RF3VhtZncoZY+IoIsFpUrb+jbVPEM/Mw1N/fn03e3eDygFcXtDvSGLiV2u4vnHl1MdlZxrSWlz9GuQzBnz5R43YTtHB/BTXcMJiDIwrz/7fUolBcRGcCNtw9i1qe7PHz2LqfOkeSznDld3CrCLP2i5IUQZtwK/ksp5ZzKt88IITpWWvEdgWx/zGXQeijIK+Olp5Y3uPF0QzBbFIaMaFxNmdHjE1g896DXuioms8Jd/zecnn28LjANWpDLJiRwJrOI7787iMmsoOuSsHAb9/16NK/8dbmHohcChgzvzJrlKfVT8AL6D+qIogiys7xX0OwQF4qqKlxzc38GDotjw6pjVJS76NW3HUVF5ZSVOomKCqK0xHuuh8mkkJ3VRpS8cJvs/wGSpZSvVzs0H7gbeLny/3lNncugdfH2a+vIziquX03xOqIjfBEcYiOxkYo4tlMYN98+iNlf7UHX3E2gTWaFxN4xPPznSbXWzTFoOYQQ3HT7YCZOTWTJ/IOcPVNC957RxHYK46ob+7F84eEqK99kcneEuvmOwbzz2ro6FbxqUrBYVO74v+HM+mynz/Nyskt44lfzyM8rI65zODPuHExFuZN3/7EeiXsfymJVUVTvfX5dTr3VlKzwhyU/BrgL2CeE2F353p9xK/dZQoifA+nAT/wwl0ErIT+vjNSjnlmFPmmgglcU4W7l9vTkOotk1caVN/RjyIjObF1/AofDxZARneiWGF1nwSuDliX3bCnPPbaY8nKnuyTzrtPM/2Y/jzw9mcTe7Vi2MJnCggoGDo1j+vV9CAsPwGzxHvUlBES3D8ZqMdE+LpRRY7vSrkMIYy/vzsG9WR4x8KoqOH4kp6oc9bEjOfz9rys8xnXYNRRVoKpKjdWs2aIyYEhsVXG1lsZIhjJoFCfTC/jb44upKG9YqYP6IgS89/Vt2PxQedLg0uMfz/3A/t2ZHq6ZsHAbb3w8w+uDf/O6VD5+e7OH0jZbVGbcOYS5M/eAdNsbigK/+P1Y1q88zt4dp7DbXQjhTnByNbDjVWCgGYTbepcSRo2P52cPjMByETNhjdo1Bn7hzOliZn6yg327M1FV4dF4w58IITDVsxm1QdvC6dTYv+e0101We4WLtGPeuz+NGBPP9o3p7N2ZWWPT1unQmPnJdo8N1rdfXcsLb17DpGmJbF6XRkFeGcXFdtKPNyyEU1EV3vrvDArzywkKsba6MgetSxqDVkt+XhnPPPI95WUOd2w8lY2mG+lrr4uQUGuN3qMGPx6kLn1/p4TwmcWqKIJfPTaeHxYf5suPttV4SHhzWGiaZPaXe6iocHJo/xkcDq3WDle+5hyUFIeqKkRGtw73zIUYSt6gXiyddxCH3VXjj0VK90aW1gwFyIoKK9B12SR/vMGlicVqIr5HFMeP5HgcE8Jdd8gXQgh2bjnpM9SyOppLZ+uGE41uRi4EBASZufn2wY26/mJhlOIzqBcH92V5taCaQ8GD+wFy+lRhs4xt0Pq598GR2AJMqJUlNIQisFhV7n1oVJ0rvJPptZbIqkFjFTzAyHHxNbpXtVYMS96gXkREBXLiuOcfT10NuRuLotBs7fgMWj9dEiJ54c1rWbogmZRDZ+kQG8q06/oQ373uuu/t2odQmN/4bNcLEcK9QrBaTUjcZbTvfnAkYyc1TwN2f2MoeQOf6JrO3l2Z7Np6EotZxWxWPXp0NpclHxkd3CoSSQxajuh2wdzx8+ENvu76Wwby5kurcDr8892U0l3sLjjUipSSMRO7MayZmr43B0YIpYFXXE6NV5/9gdSUXHcThmq+cXdomGyW8ElFAYvFxBPPT613tx4DgwtZvewoX3y41SMCzGQWuJxN03lms0pkdCDPvn41Aa0koa65Sw0btEFWLj3K8SM5VTHHui6rNkJn3DmY0eMTfCaf1EZt1wgB19w8gNc+uNFQ8AZNYuLURN796lbu+HkSHWJDMZtVYtoHc8VVfZo8ttOpkZdbxsolR/wgafNjuGsMaiClJD+3jNVLj3hNEZe4M/2klA1eDpstCg88PIavP95BXk6Zx/GOcWHcfEfrjlQwuHQwm1WmXtuHqdeeV+zPP7HYL2M7HRrbNpzg6hv7+WW85sRQ8gZV7NyawWfvbaGkxOGzRrzUJZqm07FTOBaLWq9qf+cwmVQCAiw8+IdxvPbsD2iajsulYzIrmFT3A8DAoLmQUpJy2DMss7G0tqQnX1waUho0O0eSs3m3HgWeTCaFwUlxhEcGMvvLXQ2aw+XUSOgRRXCIlRfeupYfFh8mIy2f+O5RTL6yZ6tNJvEHJ+auZ+/LX1OakU3k0ES63jgWZ34JAR2j6HrDGEyBtpYWsc0jhMBs9m2Y3HjrQBZ9d6DWdn/nMJtVJk5LBKCk2M7c/+1l87pUXA6dbolR3PnAiDZVoMygDTB35t46FbzVauKyiQm06xDCS08ta1Cmq8mkMO26vphMCseP5hAaZuPWe4Y1UeqW4VywQn2LnO19ZSZ7nvscV5k7rO/Uoi2cWrQFYVJRbRY2/+pNpi57hZjhvZtNZgM3oycksGH1cY+w35AwK9fO6M+aFSnk2T1diRfSb1AHRo6Np6LcyV//sIjcs6VVxw7szeJPv57PLXcP4aob+/v9HhqKoeQNAMjMKPD6vhAQFRNEaLiNosIK1qxIYcPq4+4mCg1wyWu65NjRszx4x0xMZhVdl8R3j+I3j08gPCLAT3fRvJSeOsuWh98mY8EmpC6Jmz6cUW/+mpCEjj6vcRSVsvvZT9HKPTsdSZeGq8TdE3TFNU9yy6lZKCajlENzcus9wzh+NJezWcXY7S4sVhNCCH7/5CRUk8pvHp/A3/+6Al3XfVr0QoFO8eEIAW+9vLqGgq/Ot1/uod+gWLp2i2zOW6oTI4TSAICXnlrGof1nPN63BZiYdl0fFn93sEH+9/ogBMR2DuP2+5LYtDYVXZOMHBfPwKFxLVrOoPTUWdLnbURqOp2vGUVIQkecxWXM7n03FdkFyMqyskJRsEQEc9Oh/2KL8r40z/xhJytnPIOz0LsiOIdiMZF435UMe+HnWCOM/IDmRNcl+3dnkpqSS0RkIMPHdK0RCllaYmfjmlQWzd5Pfp73xtxjJnZjUFKcu758LTp08pU9+dkvRvr9Hi7EqEJpUCfX/3QAx4/k1FDkQhEEBJjZvjHd7woezpUuKOKNF1ZXJVnt2JJB3wEd+O0TE1BaIOP1wL/msOPxD91PICnZ/vgH9HvkJwS2j8RZWFal4AGkruMqq+DwBwsZ9Kc70DWNkrQzmEMCCGgXAYAlLKjGNb7QHS4Ov7eAw+8vZPg/fkn/h2c02z3+2FEUwcChcQwcGuf1eFCwlSlX96a02M7C2fs9Yu2tNhO9B7RnybyDtSp4gOIi752jLiZGnLwBAH0HduSeB0cRFGzBajNhNqt0TYjgyZemcSqj+WrI6JqskUVrr3BxcF8W2zdnNNucvsjbd5wdT3yEVuFAK7e7/69wcPD12aR+s6bKp14drdxB1uo9pM5azf9if8q8Qfczq8ttfD/x95SeOkvUsJ7YokPrL4SUbHvkPXJ3p/jxzgwaw+SrenmtCa9rkiHD4zh7xnvrwHOYzAqDkzo1l3j1xrDkDaoYM6kbI8fFk5VZRECAmaiYIAoLvC9XmxN7hYv1K48xYkzDm3c3haMfL0Z3OD3ed5VVUJ6VhzCbkM6aWb5CVVAsZtbd9wpa2Xmr7cz6fXw/7mFuPvoZV8x/gcWX/xHd7sBV7kC66lgV6ZIfbvwrQZ1iCGgXTpfrL8MaHUbZyRwiBnYjZmQfo7PVRSAk1EZYuI3Skpr7KVLqzPrvLsrKPPdZap4Iw8d0aUYJ64eh5A1qYDIpdOoSXvX65IkCVJP3PpbNSVOqAzYWe26RT9eKJTIEJf0M2gXPAKnpnF65C638gmW5LinNyCZj4Wa6Xj+GWzJmkj5vI6UZ2SgBZrb87h2oxY1TeuIMpSfceyQnvlsPikC1WhCKILx/PNOWvoIl1HvIafbmgxx6dz7lZ/LpfPVIEu+ZjjkksP4fhAEAmScLyfGyqepySTasSa0ss+37gS0E5OeW0b5jA1ZyzYCh5A1qJSIq0GvDBX9R6fqugdVmYszEbs03qQ86XT2KE3M3VEW8nEMNsFB+Og+twtPKBzwVfCVS00mduYq4KcNI+Ww5GQs3Yg4N4uzW5FoVvFd0WTVP7s6jzB10P6GJcXS+ehQ977uySonve+1/7HqmMppHSs6s38eB17/l2m3vYotuHXHblwrFhRWVlVA9FbkudRS99kgoRVV8JhVeTAwlb1ArsZ3CiI4JJjuruFnGv1DBW6wq3XtGM2LsxXXVAMTfNI59f/+agoMn0B1ut4wwqWjljiqruqHk7j7KvMEPUHY6F1epf8rfSqdWZelnbzzAgTdmc932d9EdLnb99ZMaDyOtzE7Z6Vx2P/cZo976jV/mb0tomk5BXjnBIRastprFxjrHR/jsQmWzmSgvq71An9VqqjUh6sTxPHZsTgcgaXQXuiQ0T6iloeQN6uTWe4by1strGnydanL7jRvi6omMCuSRpye3WC15c0RwjYiJOv3ndeAoKMWRV4zubJ6G51qZnfLTuez+2xdEDkhAqCru5ozn0R0uUr9ZYyj5akgpWb7wEN/N3IvLqSGluwnIz34xoqpcQWCQhSuv78OS+ck1YubNFqXWuk1CuJuH3/erUV4jxKSUfPWf7axefhSnQ0MIWDz3IJOm9+T2+7xGQTYJQ8kbeCCl5ND+Mxw6cIbgECvrVjQu0qMxfvzcnDJyz5bSrsPFjxU/9O58cjYfQjr9t8S25xTWK4SyKegOFyn/XcKI1x9099z1grFRW5M1y47yzRe7aijvLevSKC228/CTk6reu+n2wUS1C2bR7P0U5JfTMS6MkWO7suDb/T6t/JFj47n6pn4elvmJ43lkZRZRXu5kzfKUqrmlBIdDY/XSowwZ3ok+Azr49V4NJW9QA4dD49VnVnDieB72Chdmi3pR/Yomk0JBXvlFU/JSSlylFZgCrRz+YKFP/3qjx29mBX8OZ1EZp1ftRnpRPIrVTPxPxpP87nwOv7+AktTT6C6d6GE9Gfby/bS/rPVXUvQ3383c65HR6nRq7N9zmrNniolp7/7+CSGYOCWRiVMSq85LTcll3qx9Xsc1mRR+8fCYGhZ8SbGdfzz3AyfTC1AUgd3u8potbne4WPfDMUPJGzQvi+bsJzUlt0qxX+yNI5dTJ7Zz828QSik58OZs9r7wJY7CUszBAT6t4EuFtG/X0vWGsaTNXovUddAlis2MOTiA1FlrqMgprLHhe2b9PpZOeZSp379EhwmDWlDyi4um6RTkew8NNpkUMk8WVSl5b8R3jyQk1FrVa6H6tSPGdPVw0bz3+npOpObX3UVN4jGmPzCSoQxqsGZ5SotGBHTvFU1QsAVwV61M3pdF8r4sj7aDTWXvy1+z66lP3GGTLg1HQQmOgtqTW1o7usNF+rwN7n2Ec2UhdIk9t5iKM/leI3q0cjtbH3n3IkvasqiqQkio1esxl0unfR2rSCEED/95EsEhFmw2E4oqsNlMdIgL5c77R9Q4t6ignEP7s+rVJtNqMzVLXL1hyRvUwGGvnyXhLfTRHxw7cpZlC5Jp3zGU9/65HindBrYE7v/taJJGNz3qRnM42fvyV54ZrK2njFPjkBKtojJBp1KpnIsSqo3cXT++7Nqrb+7PnK9213DZmEwKPXpG0yGu7rj2zvER/PM/M9i5JZ3cs2V07RZB34EdPWouFRXZUU2KR2mEC7FYVTp1CffL9/tCDCVvUIOBQ2PZvC6tTgU++cqerF913O99Xp0One++3otL0zwiGN5/YwOxncObXKe77FQOtECyVWvFEvrjS5Safl0fSovtLJ2fjKK6k5r6DuzIL/8wtt5jWCwqo8Yl1HpOTPtgNM37d81sUYjtFI6iCMZe3o0JUxIxmfzvXDGUvEENbr5jCHt2ZGKvcNby5VRpHxtKzz7t2Lsz0+8y2O0uvJnVLqfOD98f4q4HmlbVzxYTjt7E0Mi2gmqz0OuBa1tajIuOEIIZdw7hmpv7k51VTFhEAGHhvktea5rOzi0ZbF6XhtmsMvbybvQb1LHWqCWnU+P1v61E9+Ims1hVbr1nGJOv7OWX+6kNQ8kb1CCmfTAvvHkNi+bsZ/umDAoLyj2ses2ls31zOmdONVeClPS6ktB1yZmspvvNzcEBBHVuR3HKqSaPdUkjBB0vH8KQZ+9uaUlaDFuAuc4kJJdL59VnVpCaklu1MbpzawajxsZz769G+VT03393gGOHc7waS3f+33AmTEmksKCcZQuS2bszk9AwG1Ou6e33ombGxquBB5HRQdz1wEje/GQG1/1kAGazgsVyPoVb1yWH92f7jFBoCkJAULDF67LVbFHp1bedX+Ypz873yziXOpnLd7D2Zy+7I28MvLJpTSqpR3NrRL7YK1xsWpfK0UNnvV5TUe5k4bf7vQYM2GwmTGaV3LOlPPnbBSyZl0x6aj77d5/mnVfX8e0XDWurWReGkjeolRtvG8Rt9yX5PbrFF1JCSbHDI9FECLBaVSZN7emXeS6sT9NcqAEW1CAbis1yPuKlpTknhpToThfpczewaOxv0TXDheWN9auOVboQa+J0aGxdn1bjPV3T2bD6OH+4f47PHgy6lNgrXMz+ajelJTW/63a7iyXzDpKXU3uTmYZguGsMamXmJzv4YcmRZi1S5otzq2AhBP0GdeRnvxhBWZmDVcuO4HBoDE6Ko1tidIOzOZ0l5c2+8SpMJqateBW9woE5NJDo4b3I2XqIQ+8vpDQ9G2FRydmcjO7SapQovihccOu600VRyik2/+ZfjHrz1yhmQy00Bl2XvPnSag7uzaq1yY6uSfoN6si3X+zyWm1VUQT7d59m/BU9/CKX8ds08EleTik/LD5cZ/hXc2E2q9xyzzAun94TRREsW5jMrM/cfxi6prN03kEGDe/Eg38Y16B2gdsee7/xQinCrSTrfOpJzqzdw+Cn7qp6p93ofrQbfT67VHe6KM3I5tueP2vcQ0dVGl7N0he65Mh/vqf4WCZTF7+MUIxF/jnGTurudtdcYM2bLSojxsZXvT6w5zTJ+8/U2UVNSklJcQUms/cqlkIIzD6ONQbjN2ngk0MHzrRYoTAABKiqQFEEWZlFzPpsF06HhubSkRLsdo09206xeV1qg4Y9/OGiRomjBljp+9ubuHbbO0QM7IZiNfvOkpWcX4r4QDGbCOkWW9UqsCGE9upMrweuafB1tSGdGlnr9pL6TcOL0bVlRk9IICExCqvtvE1stZkYPS6BxN4xVe9t35Rer4xVTZO88eJqxk7q5lWZ67pk8HDvrQkbg2HJG/jEFmCuU1E1J1KXDBnRGYDN61K9hqLZ7S5WLTnCZRPqV38+/2Bao6zf6atfp/3oflWujBt2f0jZ6VwOvbeA/a/N8qh5o1hMxN9Yv5jrAY/dws6nPsZV3W2jCKyRoQR1bU/hwTR3ffhK1AArI//5EJ2mj8BVUs7xmSv9VlRNr3Cy9s4Xydl2iOGv/tIobIY7SeqxZ6+oEUI5bnJ3+g7sUOPzMZuVeicJOuwu+g7swMG9pzl9soiKChcms4IQggceHkNAoMV/8vttJIM2R//BsT51fFi4DXuFC4dDa5YuTooiCAmzseCbfdxw60AK88t9xu03pN7H9sc/aJQ87S/rj2KqaXUFdoxi4BO3cXLxVgqTT7jrxQuBKcBCn1/fQHjf+HqN3fd3N1OacZZD78xDsVnQHS4i+nVl8rznsbULZ+9LX3PwzdnY84uJ6BfP8Fd+Qdy04QB0vWEsx2eubNQ9+UJqOoffW0hY7670+r+r/Dr2pYqqKgy/rCvDL/PMSHW5dCrKnISGB9R770oIga5L/vr3K9m7M5ODe08TEhbAmIkJREZ77/jVWERd3cYvJklJSXL79u0tLYZBNZL3ZfHP51fV8Eeeq5f968fGc/RQDgu+8V6RrzFYrKrbp9mAr6XVpnLZxG5cNqEbneMjCAgw+zz3vwHT0O0uTnTry8kefdGFiZDCPHoc2EpIcYHXa8L6duWm/R/7HFNzOEn7Zg0n5qzDHBJI4n1X0mH8wPrfQCX2vCLy96US0CGSsF6d6zw/Z8cRFk/8vd+akVxIaGIcNx/+rFnGbgu4nBr/+2wnq5cdRdP0BpXWNltU/vXfGX6z2IUQO6SUXovRN7uSF0JMB94EVOAjKeXLvs41lHzr5F+vrGHHpnQPKyUo2MJb//0Jrz6zgkP7G9c5qTkIDrWSNKoLU67pXdWv1uXS+eazHSyZsx/UahZ5tfV1322raJeVXmMsxWriuu3vE9Ev/mKJXy9KMrL5rt99zRoKag4N5M6CBc02/qXOe/9cz45N6XVutIJ7ZXpuxWuxqtx8+2CmX9/Xb7LUpuSb1V0jhFCBt4EpwElgmxBivpTyYHPOa+A/pJTs3nrS6zJU03SOJmdz6z3DePHJpR71uVuKkiI7q5cdZe2KFIYM70RqSg55uZXK0OTlK1/pk0oeOo6Y779EtVkISehAx8lDGPjYbQR1ivG8poVJ/vdcdIf3nrP+InJQD9K+XUPu7mOExLcn4ZZJRkPwSgryyti28QSuBkSeCQFh4QHc/vMkIqICef5PSzhxPI+QUBvTr+vDFVf3blCUWH1pbp/8CCBFSnkcQAgxE7geMJT8JYTmw+cuhMDp1OgzoANPvTSdbz7fRcrhs5SXNa/yqS+6LtmxJaPe50vVRFlwGD/5/lnajx3QjJI1nZxth+pVYbIpnN2WzLr7juIqKccUZGPbo+8zfeU/iBqSWOO8c96AH9MmbebJQsxmtd5K/pwVX1xs56uPt1NW4qhaAeSeLeWbL3aRebKQex4c5XdZmzs+Lg6o/ld2svK9KoQQDwghtgshtp896z1F2KDlEELQp197r6GCmkunZx93mYGu3SJ55OnJvPfVrUy/rs9FltJ/9LxvaqtX8AAR/RMQJh+x1OeUbROtQr3CWeUOcpVW4CgsZcGIh5if9EuOfbmCsqw8Vt3yHJ8FTOdTy1SWTHmEgkPpdYzaNohuF+yz/V9taC6dwvxyDxePw66xfuUx8nLL/CViFc2t5L19y2qYhVLKD6SUSVLKpJiY1rcsNoA7HxhOgM2Meq6ejHD7FW+7L8kdZnkBP717KFHRl9iyXkrQNaa+8cuWlqRe9PnNjagW7wtxxWJC+DGZpjpS08ndeZQNv3id2T1/RtqcdegOF1LTOf3DLhaMeIjSU23fWGvXIYQePaNR1YY/SH1tg5pMKseP5jRRMk+aW8mfBKqHCXQC/F+b1qBZiesczgtvXcvl03vStVsEQ0d05tGnr+Dy6d7ryKiqwu+fuhyLtXkUjd+p/Ku77Ub/pJFfDMISOzF57t8I6BiJKciGGmitsuB1u9MdN9+MpRu0Mrvbyr8g58BVUs76n7/abPO2Jn7zxES6dqu9gmVDkFISGmrz23jnaNboGiGECTgCTAZOAduA26WUB7ydb0TXtC0yFNAHBgAAIABJREFUMwqZ8/VudmzOaJZYev8h+dm9Q5h8fet301yI1HUKktNJ+WI5yW995/dG5I1CCG7Lno0tqvl79bY0ui6596YvfB5XVIF+QX6HooCiKjX9+QIiowL5xwc3NWrztbbomma15KWULuDXwFIgGZjlS8EbtD1iO4fx68cmMPmqXuddPa0Mk1nhV49NuCQVPIBQFCL6xeMsLG0dCh4QqsLJ77e2tBgXBUURRLfznrykqoKJUxMxW1RsASasNhOqSTD28h706d8ei0XFajNhCzARHhHAo89ccUlG1yCl/B74vrnnMWi9XHl9X9avPEa5preqPqrXzOjHDbcM8msxqJYiOqkXx4KWN1tiVENQzKbmaQDcSplx5xA+/vcmj83UsIgA7vq/4dx8+2C++HAbWzecQDUpbFmXiq5Lpl3Xh46dwgiPCKDvgA4ozVQnqnWaVwZtiqiYIP76ypUMGByLogqEcFtAFqvaMqVxBIyb3J2f3Dm0TSh4gG63umPYhRdFoQZaESbVXVDND5aiMKmYgmxEj/QRRSUlcdOHN3meS4VR4+K5dkZ/LBaVgEAzFqtKbOcw/vT8VBRVITOjgB2b09E0HYddw27XcDp1Fs4+wEdvbeTNF1fz+vMrOXE8r1nkM8oaGFx0pJQcOZhNdlYJxUUVzPl6t0fTbn8QFRNI7lnPkDSLReXFf11HTPtgv8/ZkpSkn2HD/a9zepW7s1DkwG4Me/l+0matJmvtXmzRYUQNTST1f6uoONv4TlCx05KYNPMv6A4X84b9koqzBeh2JygC1WZh2As/p9/vbvbXbV0ylJc5SE/NJzjUSlzncI4eyuaz97eSnlq/LmQWq8oTf5tK957RDZ67RcsaNARDyf84WfTdAeZ+vQcEfsmaVVVBr37teOTpK9i45jifvre1cvXgrhL44B/GMSjJf6VcWxuucjvSpaHaLCyZ8ii5O45UuXHOWeBZq3Y32qViCrJx+exniZuahLO4jCMfL+bUkq0EdIik94PXEzOitz9v55IkPS2fvz2+uMHf58TeMTz18vQGz2coeYNWT3mZg+NHc5j3v30cT8nF6aUeiGpyRyooikDTZFWhtBl3DKZLQuT/t3fe4VFV6R//nHunpgMJARJCDSWhg3QQFKQqCCgqutjXXlZXZdey1rX3/nPXroCLhaJSFZHepLdQQ4BAIIW0qef3x4SQODPJhFQm5/M8PGRuOefcm8n3nvuet/D7L3tx2N30HdSSbr3iim2cdruLPTuOo2mCxA4xfos1BBt7v1jIittf97LTa2ajJ1q2En/7caN6c8m8f1d2iEHLWy8sZf0q73xP5aHrgv/OurbC/dVa7hqFIlCsISaSuzajQ6cm/LYohV/n7yEvz46mC04ez8No0uk3uBVjJyazZvlBtmw8QlQDKxePbk+bdp4guo6dm/hs22TSSe7atCYvp06w98tFPhdi3bbKp53I3X+00m0EM/v2ZJzTM7RkYZKqQom8ok6h6xpDR7Rj6Aj/BbtHjU9m1Phkv/sVHoRexhuLoFKeTtk7U9n+znck3Xn5uTcSxDSKCeVURsVTFAy5JLH8gyqI8q5RKIKUxOtHYAj1EUF5pk5tJVl97zsUZpz7Am4wM3ZiJ58R3yazTlRDq89zYpuGc/nV3ap8LErkFYogpcWEQTQb3hNDWJHQC4Eh1IIpsooqD7klB2b9VnqT04WzjgRl1SbdesUz7krvwjEOuwun00XbDjFomufN1WDQGDoikRfeHYfJVPXrRcpco1AEKULTuOh//+LIwvXsm/ELmtFAmynDODx/Ldte/aZKbPObn/+a+FG9MYZZWXnXmxz8dhnS5SYqqQV9376HJoMqXiErWNjrI9mYlJCbY2dfXgYdOzfhult7E904rFrjNZR3jUJRzyjMyOb7zjdRkB6Y/3aZCIEhKgQNgT07r1RSND3EzNjlb9Gwa5vK93OekZ1VwH03zfLKW/NnmsZFcNvfBtKyTaNK9VdruWsUCkXdwxIdybDZz0BVhNFLiTMzD3tmrlfWS1eBnY1P1c8asRnH8zAEcH+PpuXw7D/mV0uK4TMokVco6iENeySiG6vZWislJ9ftqt4+6iixTcJxuwOL4rbbXEz/eH21jUWJvEJRDyk8noXbVf01eUMTYqu9j7pIWISZfhe2Dvh4X/b7qkKJvEJRDzmxZie6xVStfQijTpdp11RrH3WZ62/vS0iod+U0X1h9VFirKpTIKxT1kJMb9xTXb60uWk0eSvPRfaq1j7qMwaDRd1CrcksEGk06Q/1UWasKlMgrFPWMgz8sZ+vLM6s1t78w6PR/7z5yUtI4MOs3TqzdSV3y5KspPEFRBq+U2kJ40m2YTDrJXZow7orqK1qj/OQVinrG+mkf4cqvvoAlzWxk4EcPsnTKcxxZsA7NZEC63IS1bMKI+S8Q0qziqXTPVxrFhPKvl0cz87MNbP3jKEaTzoChrWmT2Ij8PAdt2seQ0LJBtY5B+ckrFPWMT82X4HZU4aKrELS6aijS6cIS24Ckuy9nx9vfs/ujebgK7GcP0zUadm3DZever7q+zyMyjufy3fTNbNmQhtli5KKRiQwf2xFDFZTGVFkoFQpFMdYmDclLPVE1jQloe8MIHNl5pM5ZCQgOzV5OYXqWV0StdLnJ2nmIrJ2HiOqQUDX912HsdhfrVx4i9WAmIWEm5s3aRmGBo6iofSHffrWJHVvSuf/RoYhqLJGmRF6hqGd0fuRq1j30YeXrwRZlskz5+GePkbkoGCr/kP8HiGY0UHD0ZNCL/KmMPJ56+GcK8uwUFjrRNFEk7mex213s3JrO3t0ZtG0fU21jUQuvCkU9o8Ntl5F070Q0kxFRwZwpDbsnEtaqqUfUz2iWxCva1R9um4MGXQL3Hz9f+eitFWRnFlBY6ATwEvgzOBweoa9OlMgrFPWQwowshCbQNK1C/vK5+48S0bbZOVWV0kPMtP/rWCyNIit87vlEQYGDnVuP+xX2khiMGqFh1RuvoMw1CkU9Y+/nC9n35WJchfbyD/4TzvxCTm7YE9Cx4a2bopkM5OxJwxITRae/Tyb53gkV7vN8w+Vwe0xZgSDhgn4tqnU8SuQVinrGtjdmnbM93u1wYWoQhu1kTpnHGULMXPDybbQYP/Cc+jmfCYsw0zg2jKNpvu+R0aih6RpSSu58cDBhEeZqHY8SeYWiniDdblI+XUDWtgOVaERiDA8p8xBDmIUez9xYLwX+DDfc0ZeXn1qM0+H2mG2Kgp8mXN0Vg1HHajXSo09zQkKr11QDSuQVinrD0uueI3X2Stx2Z6XaceYXopkMPtvRQ81cnf4tBmv1zk7rOu2TY/nXy6OZN2sr+1NO0SQugjETkqvVi8YfSuQViiDCZXeQOnsFmdsOEtGmKS0mDsZgNZOxfjeHfljhN9JVt5qRbndA1aJMkWF4xenjCXZqMW5gvRf4M8Q1j+LW+2r/bUaJvEIRJOSlnWDegHuwnTqNM7cAQ5iV1X97jzHL3uDIwvV+Z/DCoNHt0Wtxu91sfu4rXOXUaI1KSqDlhEH88dRnOIseGrrFhCHMSs9/31zl11WXcDhcrF1xkE3r0giLMHPh8MRqT0tQWZTIKxRBwrKpL5CfloF0eYpVOHMLcOYVsmTSv2j/10vRjAZcTu90BlEdW9Bl2jW4nS5Ort9N2vx1uB1OpI9j9RAz8aP6IN2Sro9ex/FV2ylMzyRuRC863jkeS0xUtV9nbVFQ4OCZh3/mxPFcbIVONA1+W5jClVN7MHxMh9oenl+UyCsUQYA9O5f037cUC3wxUnJ631Gie7Xz6dtuCDHTcvJQtrw0HdupXDreMY62N47i4DdLObpkI4Unc3AXuVrqIWZCmzfmt788j24ygBAIIbho1pNIKUmbv5boCzoQ2b55TVxyjTNv1lbSj+bgcHjusdvtiVqd8cl6LuiXQFTDshekawsl8gpFEOAssPu0k4PHHGOwmhnw0QMsv/kVwGO7N1jNRLRvzuZnv0C6JG67gy0vzwC3xBBqAQEGi4mIrm0wNwijQXJLdr43G7fNUcp2//PwBzGEWgGQThdxo3ozdPpjaNVdXrCGWfHrvmKBL4nQBBvXHmboiOrLCV8Zguu3oFDUU6yxDQhp2ojcA8e89mkGA5FJLXDkFdLx7vHkpBwhom0cTYd2Y8mEJ0oHRZUw9ZwhY+1ONINO+rItxTb4UsjSx6f9vJY/nv6cHk/dUHUXWAfwG8Aq/actqAsokVcoggAhBP0/uJ/Flz/uSe9bZJrRQ8z0fv0OFo97jPRlm3EW2NBNRtIEOHLyEFoAoZluidvuDNj10lVgY8e7PwSdyPcZ2IJF83bhdJaezUsp6dYrvpZGVT5K5BWKICFueC/GLHuDTc9+yalNe4loF0/XadeQsW4Xx37bVOw+eWbmvvu/PyG06klf5cjOq5Z2a5NLJ3Vm/apUsrMKsNtcxQFOYyd2olFMaPFxebl2Fs3byZoVBzGbDVw0sh39L2yFptdOqjBVNEShCHJmdZhKzu7DXtt1qwm33YV0VWEBkSIa9WzHZWvfq/J2a5vCAgfLluxl45pUwiMsXDSyHe2TY4v35+Xaefxvc8nOLCi235vMOl16xHHXQ4OrLW98UBcNyUs7we7/m0fmtoNE92pHu5tGY4kO7ix3CkVF8JenRroleqgZZ07+uTcuhCf6tcRCrG410/vl2869zTqMxWpk+JgOfl0mF83bWUrgAew2F1s2HCFl1wkSOzSuqaEWc16LfPryrSwY+TBupwu3zcHhH1ez5YXpjPn9DaKSWtb28BSKWiFjw242/PO/HF+1HUujCEJbxpJ/7FTxoupZRKVTHOghZlqMH8ixpZuwncyhYbc29Hr+FpoM6lKpds9X1qw46NMDx2Zzsmld2vkn8kKIl4BLATuwF7hBSplVtG8acBPgAu6RUs6v5FhLIaVk6dXPlJqluApsuArtLLvhRS5d/W5VdqdQnBdkrNvFT0PuL/aCcWTnkX/0FJpBB03D7Tgr6m6HI+BiH35xuen22LVEfj6tcu0ECWazb0nVDRpmS+3MqSu7ErAQ6CSl7ALsBqYBCCGSgKuAZGAk8K4QomIlaMoha/tBbJmnvXdIyalNe33vUyiCnLV//8DLzdFVYMNtc2CMDCntS19ZgReC+FG9iWwXnMFP58JFI9thMntLnaYJ+gxsWfMDopIiL6VcIKU8MzVYBZzxIxoHTJdS2qSU+4EUoHdl+vLq2112Yn7p9n5lUiiCnROrd/jdZ8vIOaeKTv7QzQYu/PrRKmsvGOh/YSu69IgrntHrBg2jSWfyX3rQuEl4rYypKt8fbgRmFP0ch0f0z3C4aJsXQohbgVsBEhICL+7bILklxvAQnLnei0pRSS2CvsSYQuELY0TIOVV8OhcadktENxlrpK/zBU3XuOuhwaTsOsGmdWmYLQZ6D2hJbNPaEXgIYCYvhFgkhNjq49+4Esf8E3ACX57Z5KMpn1MIKeWHUspeUspeMTGB51oWmsbgz6ZhCLEgisKnNbMRY3gIA//z94DbUSiCiQ63X4ZeA6l+9RAzPZ66vtr7OR8RQpDYoTGTru3OpZM616rAQwAzeSnlsLL2CyGmAmOBi+VZp/vDQElDXTxw5FwH6Y9mF/dg3Kb/Y8fb35O1/QDRvdrT8c5xhDSLruquFIrzgq7/mMLJjXs4/NNapKNynjP+MDUIo//7f6PZsJ7V0r6iaqlUMJQQYiTwKnChlPJEie3JwFd47PDNgMVAopSyzKgLFQylUFQNx9fsYF7/uyu/uOoDY0QIk9NmYixKSqaofcoKhqqsd83bQDiwUAjxhxDifQAp5TZgJrAd+Bm4szyBVygUVUeDpJaExlXPG610Sw5++3u1tK2oeiq18CqlbFvGvmeBZyvTvkKhODfW/+MjCo5n+dwnTAYiE+PJTTuBM6viOWZcNjsF6ZmVHaKihqidjDkKhaJaSfl0gc96rULT6PPaHVy+5T+0nTIMzVxx7xjdZKRx345VMUxFDaBEXqEIQpx+6rQawiyENG2Es8DG7o9+DKhwd0l0i4mG3dvSeECnqhimogZQIq9QBBlup4uIRJ9hKbhsDgozspnb/67ABF4Tnn+6hjDoIMCZW8ihH5ZX8agV1YUSeYUiiHDZHfx88QPkHkj3uV8zGVl93ztkbtpXdkOawBBuRWiaJw7F5UY6XbgK7Jz6I4Xfrn2ObW/MqoYrUFQ1SuQViiBi7xeLyFi/B5cfc43zdH5x8RB/CF2jUc92yCJhlz5m/M58Gxse/S/OfN9pjBV1ByXyCkUdQ0pJ2sJ1/Db1eX6d8iyH5qwIOBdTymcLcFVGeDXB+C3/wZGVF9DD4NTmct4IFLXOeZ1PPhBO7ztC/rFMopJaYI4Kq+3hKBRlIqVk2fUvcPDbZcVptFPnrKDJkG5c/N1TaHrZyVwrVXhI02hx+QCiOiSQl3ai3MNdDifmBrUbsq8on6CdyRccz2TewHv4rtNNLBwzjRnNrmDtQx8QSIRvTkoaJ9bsVK+iihrn6C9/lBJ48Cx0HivaXpiRjeO0/0pObaeOwBBqqXC/msmIpVEEvV+5HYCItr4XbksSlhBLZHuVZriuE7Qz+QWjHvG8SrrcxVn5dr47m5C4aJLvnejznNMHjrFkwuNk7zqMZtSRLjfdn7yeTn+7oiaHrqjH7Ptqkc9yfc68Qn6/4UXcTjdISezgLnR++CqiOiQQGn82sV+bKcPY/Z+fOLFmB9LhO8hcGDSk0138szW2IR3vGEf7v47F3DACgJ7P3sSSK5/EXeAno6UmGD7nmUperaImCEqRP/lHCplbD3iVO3PmF7L2wfcpPJFNp79NKv5CA7hdLn4acj/5hzOQbjeuAs/2jY9/QliLWFpOHFyDV6Cor5T1plmyGMjRxRs4umQjutlAox7tGDLjMULjYtjy8kxOrt+NdPlpRxM0v7Q/mkFHt5hoO3UETYd28yow3XxMXwZ+9CArbnsN5+mC0k2YjPR7/z4i2sajqPsEpcgfXbLRbwY+6XKz9ZWZ7P18AeM2flgs9EcWrseemeu1wOXML2TTM18Qd0kvjv76B5pBp8nQ7hgspmq/DkX9o/Xkizgwc6nf4tulkBJXoYPjK7YxM+EqQpo2ojAjB7e9DP93t8QcFRZQOu42V19M68lD2fn+HLa/MYu8wxlEtG1Gj6dvJOGy/hW4KkVtEpQif/KPlDL3u20OCo5nsfW1WfR8+gYAcvcfw+30/WDI3nOYr5tMQjMWLXpJyeAv/kHCpeqLrqhamg3vSfyYPhyet/qs0AtRfkUnCflHTpbbviHMSrPhgacIFppGxzvG0fGOceUfrKiTBOXCq3SWn/DSbXNw8Nvfij836NwK4cdzwVVox1Vgw5GT7/l3uoBfr3qGkxt2c3zlNvKPlv/HpVAEghCCIV89yqDPHyGmXxIh8dGYGladB4u1aUNaTBhUZe0p6j5BOZNvPrYfqXNWlvvKWzIfduMBnYhsF0/m1v247Wdn9ELXkC5vH2WXzc7sC+5At5qQThfxo/sw+PNpKse2otK4nS62vzaLzC37fJa3PFc0k5E+r96uSvbVM4JyJt9y0mDC28ahl2E3N4Ra6HD7ZcWfhRCMWPQyCeMHopmMaCYDoS0a+3cRc0uPTTTfhtvuJHXuKn6/4cWqvhRFPSBz634WjXuULxuN45s217J0ynMcX7OzSgUeQOiCqI4tqrRNRd0nKGfyusnImGVvsPWVmaR8tgBHdj627FyEpiGdLgxWM3EjLqDNX4aXOs8cFcbQ6Y/hLLDhzC/E3DCCP578lM0vTC83mZN0ujj0wwoKT2RhiYkKaJxn8nJbYqIw1EBdTkXd49SWfczrf7fHc0ZK7Jm55O4/WuX9aCYDMb07Et66WZW3rajbBKXIAxjDrHR/Yirdn5gKQO6hdPbPXIozr4D4kb2J7t3By23sDAaruVh0W08Zxubnvw6oT4kkLy2jXJGXbjd/PPUZW1/9H7jdSAntbhpF71duRzMG7a9E4YP10z4qFvjqQBh1pFsS2b45Q7953OcxBemn2P/Nb9izcmk6tBuN+yf7/dtQnH9UqsZrVVNXarymzV/LmgffJ2vHQYQQHt/lQGplCsGUU99jiiw7fcLGJz9l60szS0XU6lYzbaZczIAPH6js8BXnEV9EXYYjp+LVmcqkyBtHaBoSz3fXEGalcd8khs97DrfLzfEV29CMOgXpmSyb+jwgcNnsGKxmYgd1YdgPT6sJx3lEWTVe1W/xT6TNX8viCU8UZ/GTBP4QjOmXVK7Au+wOtr7yjVfKBFeBjb1fLKLXC7eqfCD1CFNUaNWLfNHErWTMhzO3gPQVW1l+22sc+GYpQhNIt8SZWzrQyZlXyLHfNrH97e/pdP+kqh2XolYIyoXXyrD2oQ/8pmktCz3EzMXfP1Xucac27S3lvVMSzWTk9L6qt8cq6i4d7xyPMNXMXMuVbyPlk/k4cwtw5OR7CXzJ43Z9MKdGxqSofpTI/4ms7QcDOs4YFYpm9njhJIwfyITtH2ON9m+Lt2fnsmDUw/x04f1+IxLddjthLWLPadyK85Pk+ydhigipuQ4DNM9WtWePovZQ5po/YWoQji0ju/wDJYxe+joxvTsE1O6vVz3D0V83+fXS0S0mEi4fiCU6siLDVZzHnNy4h31f/0IFLIKVI5DIWUAYdOLH9q2BASlqAiXyfyLpnsvZ/PzX5RZMcGTnMf+Sh5h8eAbGsLIDoPIOn+DYUv8Cr5mNtJg4SC26nmdIKcncuh9XgZ2G3dqUG2TkzC9k3/RfOL5yW3E6a7fNCQEWBKkMutWMbjXhzC0sM7eNZjRgjAyh22PXVvuYFDWDEvk/0WXaNZxOOULKFwvL9aiRbjcH/reUxOtHeu2zZeWy5cXp7P96CS6H0292Qc1o4PKt/yGiTfn5uxV1hyOL17Ns6gvYsnI9hTw0Qb9376PN1Rf5PD7/SAZz+tyJPSs3sORjVYBmNmKKCiO8dVNaXTmE+DF9mXPB7bgdzrMzek1gDA8lok1T7Nl5xI/pS5eHJhPSLLpGxqiofpTI/wlN1xn0ycM0HtiJ1fe8havQ/6zHmW/zmRTKkVfAnAtuJ+/wiXKDqIwRIYS3alrpcStqhsKT2fx61dMcXbyxeNuZTEnLb3mZ8FZNaNw3yeu8lXe+ScGxUz5TZFQVwqAhNI2I9s1pMqgLra4cQuygzqV83seufJtVd73JsaWbQAjiR/eh3zv3EBoXU0bLivMZJfJ+aHfjKA7PW8WRRRv8zrwMIWafNvmUT+dTcPRkuQKvW0x0e+IvCC3w9e/8IxmkLVyPbjYSP7oPpojQgM+tCM78QnL2pGGJbUBIk4bV0kdV4Cy0c2Dmrxz+eQ3W2Aa0u2k0DTq1qrb+Fo6axsmNe3zucxXY2fLSDC6e9WSp7dLtJnXeqoAE3hgZinS6zmm2bwwPpeXEQSTeOMrngwYgqkMCIxe9jNvlQghRoe+e4vxEibwfhKZx0awnSZ23il0fzCFt/rpSf6Sa2Uhku3iaXtS91HnZu1LZ/O+vSxV48Ed4m2a0uXYY2btSCW0egyGk7LJtG5/8lC0vTEcYNBAC6XQz6NOHaTXpwnO7SB9IKdn0zOdsfmE6mkHHbXPQZEhXLvzyn6WKrNQF7Nm5zO13N3mpx3HmFSJ0jV0fzqPP63fQ/paxVd5fxobdZO046F+spSRnT5qPzTKwQtyaoOczN2IIs5LyyXyklMT0S2LbyzMDekDYM0+z+78/se+rJbS/bSy9X77df1fl1IpVBA8q4jVAMjbsZs3975K+fCsGq5k21w6n6z+ncGThemyncmhyYVccuQUsGvsPnAW2gDwmhK4hdA3NZES63STfO5EeT9/gc3aVNn8tSyb9y2uGJ4w6Xf95La0nDw243qbb5UJoms/Q9R3v/cC6hz4s1Y9mMhDdsx1jlr8VUPvF/TicZKzbhdB1GvVMrHJhWfP399nx9vdeb0y6xcSVh6ZXuafSvulLWPHX18qssRqV3ILL1r2Pbi6dHG9O3zvJWLOz7A4ETE77xuvN6cC3y/jtL//GbXMEbO7RQ8yM/vU1onu1D+h4xfmNinitAqJ7tGP00teRUiKEIG3hOr7teD3gETNh0D1ZKf3VxPSBdLmRLndxcNS2N2ahW810e9Tbs2Hbm9/6fIWXDhebnvmcTc98gSHMQkizaBKvH0HHO8d7JT07smg9q+9/l6ztB9GtJtrdOIpeL9xa6rjNz37p1Y/b7uTkpr1kbt0fsCnk0OwVLLvhBc81SonBambI14/SdGj38k8OkH1fLvZpEhO6RurclT4XxLN3pbL11W/IWLcbY5iFJkO6kTj1koASd0V1bOG3sMwZclKOsGTivxg+97lS21tPHlK+yAPftLqGhHH9GfjR34u9tlpOGERUh+Zsf+s7cvakEdk+nsM/ryUv9QTS5fI5oXAV2tn39WIl8gol8hVFCIEjt4AlE/80q/YTxVoRXPk2tr4yky7TrkbTdew5eaTOXYUrv5C8Q8f9nnemKLMjK4/srDw2PvEpB75ZyoAP/4Y9K4+G3dpwavM+Fo17rDia15VvY/dHP5K9K5UR88+mSM4/dspnH5pBJyclrVyRz1i/m41PfMLhn9aU8sl2ni5g0WWPMmHHJ4TGx2A7lcOhOStx253EjehFWELFg8DKegv1NeM9tnQTC8ecedPynJu+bAubn/+KpLsv54KXbiszMZcpKgxZjseV2+bg6C9/kLntAA2SW3Jq8142Pfslx1dsA02U7bElPecf+mEFv+Y+xfC5/y7eFZXUkv7v3Y/b6WLJxCcoPJ7lEXd/vu8S3H4KeSvqF0rkz4HUOSuhmpL0uQrtOLLzOPbbZpZe+xxC18AlPcIUaBsFNjLW72ZOnzvRrWbcNgfmmEivdA2uQjvpy7dyatNeGnZtA0BYQiy5B455tel2OMvNRb5v+hJ+v/llvzEGbqfUV9gqAAAWYklEQVSL3R/NIyIxnuW3vOJZW3B7FiaTH7iCnk/fGPA1gqduwO4P53lcAksgXS7ix5QO5pFSsuzGF71yBoHnbWjba//j0A8rCE2IpeOd42hx+UAvwV888QlkAMIpdMHJ9buxZWR7HiqFtsAS3BXhtjk4uuQPTh84RnjLJqX2bX/rO44s3lBuHIchxEzLKlyrUZy/KJE/B+zZecWz56rGbXMw/5KHOLVlX0CC4r8hidvuLDYF5aee8HmYEIKTG/YUi3z3p65n+a2v4i48a3YSRp3YgZ3LtPm7bHZW/PW1MsXHbXOQsWEPW16agauwtFlr++uzaDKwM3EjLgj4Ers/MZXUOSspzMj29CsEmsVImynDyN1/FEtMZPE6QF7qcQqOZfpvTMLpvUc4vfcIx5b+QcuJg+nx9A2kLViPwWqiYbc2ZO84FNACqhCCkLhoVtzxus+HSiBoZiM5ew57ifyu92eXL/ChFuLH9CV2UOdz6lsRXCiRPweaDu3m+xVZEwhdQzcaAvKu8cfJDb5d9KoFCSFxZwNfYi7wkWffLWleTtHyjLW7yn270S0mTm1M8Rl74MwrZPvb35Ur8nmHT7DmwfdJnbsSIQTNL+1HVMcEji7dhCMnn6ytB9g/81f2z/gFQ6iFi759isZ9k4oXtwPCLTnwzVIO/bACUfQ7dTtdgb29CYEpKoxGPRI5neLtaRMobpuDiMR4r+0OP0nFhEEnvHVTIhLjaHfjaBLG9Vc54RWAEvlzIrJ9c1pdNZQDM5cWz9SErmEIszLql1fY/81StrwwvUKv6LWFy2anydCuxZ9X3fu21yxbutyse+RDEq8f4TeFg2YylmkjB495KP9Ihl/Po8LjZecMsp3KYXav27CdzCm2ue8/kzbX6S5+8J4Zv+N0AQtGPMwVB78mpElDopJacGpjSpl9lKSs8H9/GEItDJv7XFHpyXJEVghC4qMpPJ5VagFZt5hoenF3r1k8QNzIC9j72UKvNQfNaOCiWU/SILllhcesCG5UJMQ5MvCjB+n9+p006NSKkLho2kwZxrgNH9Cwa1sOzlp2Xgg8eAQlY7XH60NKydHFG3y+pWgGnfRlm/22E9HBe9ZZuoEiwfNzW3SLibjRvck/kkHhSd9iv+v/5uE4nV9a4Fxuj1nLzwPG7XKx/+slAFz4xT/Qw8+90Low6B4vqjKQThcbH/+4qMRkrzKPN1hNdH7oKro9dh2GMCuGMCua2UjC+AEMmf6Yz3O6PzEVY2RoqXYNoRZaTBykBF7hEzWTP0eEptH+5tG0v3l0qe3Zu1LJO+zb/l2V6BYTLrvD98NE18EVmD1f6BqFJbJuCoPu1xf7zGw95bMFbHv1GwqOZxHbP5mkeyfw21+e97uGIAw66BrSTwSwMOjoVjN7Pv6ZLf/+EumSRCTGc/H3TxHZ7uw6wJFFGyrkogoeL6Lcg56F5KiOLZh88Gtm97yN3APpFS65J50uEiYMJO9AOqcPHMORk490lr5mV6GdtPnryD2UTv8PH2DegHs8/fv4PTnzbeTsSqXvm3fT6YEryD10HGvjqDILz4QlxDJu44dsevZL0uavxRQVRtLdl5N4/YgKXYui/qBm8lWMM78QTS/7tsb0TyKmXxKGUIvHBa4CGMKs6BYjCeP6k3z/JE8bZ9AEwhi4wIMnLUBMn46AxyunUY/Es7PuEghNI3ZQZ9b87V1W3fkmmVv2U5ieycHvl/PzsL+Tl5bhZeY5g3S6/Ao8QpAwfiDOAhv5h47jtruQLjfZOw/xbdINpVIIhDaPqXAYviHcSqOeZ33FzVHhjN/0Ea2uHOLzOsvj8JxVhMTHMPq31/0+JDSzkZzdhwlp0pCJOz/xxAb4+D0bQi006p4IgG42EZkYX25lMYCw5o0Z8P79XLn/K8Zv/JB2N45S6QkUfqmSmbwQ4kHgJSBGSpkhPCs+bwCjgXzgeinlhqroq67ToFMrhL/ITiEY/PkjtLlmGFJKji3dxKHZK5BOFwe//x17dh5um8Nv5ah2t4yhw22XEtq8MZboSKSURPdqz9aXZ1Jw9BQx/ZM4/ONqXBXwymk+pi+W6EhOrN7B/JEPe2amJWadwmxE1zWGzHiMwhNZ7Ppgbmkxl9JrNhsoQtdod/NonPm2Ut48xbgl80c8zNXps0BKQuKjy7X7/xlnXiHHV24jflTv4vUER04eaQvXFQlvxdpzO5ykzl1J+rItGMKtOLK8S/e5CuyEt/VkFdWMBvq9cw+ze9xWytNGaBrGMCutJg+pUP8KRUWpdFoDIURz4COgA9CzSORHA3fjEfk+wBtSyj7ltVWX0xpUhGJ/8QJ78WxPGHQG/N8DJE71/Vot3W6OLN7A6b1HSZ23kiOLNnjEXkoQgvZ/HUv/d+8DPHZmXykCcg+m87/E6yomukKgGT1t/fnhInSNxgM7MeTLfxLSLJp9M35hxa2v4Djt28OjwmiCyYdn8uOQ+zm9+7DvQ4wGRv/+Brs/+pF9Xy4+J5dEYTQQ0qwhA//zEE2HdGXNA++x893ZXv71FRq62UijnomcWLHd55ivSp+FOersrDx9+VaW3/KKp7xjUU6aQR8/pDKQKqqE6k5r8BrwEPBDiW3jgM+k5wmySggRJYRoKqWsFwVMW191EaEJsWx54Wtydh+mYY9EujxyNQ07t/Z7jtA04ob3guHQ4bZLydy6nx3v/sDhH1eTn5bB/hm/kLMnjVOb9mLLyCYkLppu/5pK+5vOrgkYw60IISo2N5XS75uDdLnJ2nawOLe4OSqswualshBGnd9veqlMV0Nh0MjadoC9ny/0aw7yPkcv9aCTDid5B48zf/iDGEIsmBqEVUrgwePimLs/HaFrXmsYwqiz97MFJN0zoXhb7IBOTNj+MYUZ2WhGPSCzjEJRFVRK5IUQlwFpUspNf/LJjQNSS3w+XLTNS+SFELcCtwIkJCRUZjh1itj+ycT+8Mw5n+/ILSDlswXFgS/2zFyP50sR+WkZrLn3bVwFNpLuuhwAc8MIYgd34eiSjRVeVPRHyWLPTS/qjmb0/spoZiNC10q9uQSCtDlJW7Cu3FB/Z74nw2Qg6GEWXP7qk0qP+aZKinYIgdvh9LlI7cq3cWL1Dp+nqfKOipqm3L8cIcQiIcRWH//GAf8EHvd1mo9tPv+SpZQfSil7SSl7xcSowgVnWPfI/5Ub2ejMt7Hx8U88gTpFDP7sEcJbN0W3mkB4AnlMDcOJHdr1nBZ6rU0bkn/UUxhFMxoYPu/fGCNDMYR73P0MoRYa90/m8m0fY4w6h9z2ZWRV1C0mku+fREhc4AuurkoIuGYyENEuHlNUWOkFbV9js5po3D/Z58NHmAxEBJgRVKGobsqdyUsph/naLoToDLQCzszi44ENQojeeGbuJb/l8cCRSo+2HpGxbndAx7lsDgrSTxVX9glp2ogJOz/hyIJ1ZO04RERiHPGj+iB0jfTfNnNo7kr2z/iV/ADdPPPTMvi24/WM+f1NGnRqRUzvDlyVNpNDP6ygID2Txv2SaNSrHfMvecj/DPocCImPptdzN9N6yjBcNgfCnyeMUYeSC80Bvkh40jzraAYddAEuNxd+9SgJl3kie3+88D7Sl23xe+4FL9xK04u6k7ZwHfJPbp3S7lQ+64o6Q5XlkxdCHAB6FS28jgHu4uzC65tSyt7ltREsC69VwafWkeVWlgLPbPeajO/KLThSktS5KwNOtnWG6N4duHTVOz73pc1fy5Irnixl2qkMusXE5dv+W2pRMn35VhaOmYYsWkPQdI2Y/sloRgNHFq6vsIePbjFxyYIXyd5xCEOohYRL+2EMDynev2/6Epbf8oqXaUczGRi7+h0adW0LwK/XPMP+6b94tW+MCOGqY7MwWExe+xSKqqY28sn/iEfgU/C4UN5QTf0EJbkH0wPKs6JbTLS6amhAAi+lxHYqB4PVTPOx/Yju1Z4TK709Q/xxcuMeHKfzSwnhGQ7/tLrqBN5qJmFcfy+vk9gBnZhc9AZhy8im8YBORPdsx9wBd/sV+MikFmTvOORznSC8bTOaDOxMk4G+k3i1mjyUtJ/Xsv9/S3HbHJ5oVyHo/fqdxQIPcPSXP3xfiIS0n9fQYvzAAK9coageqkzkpZQtS/wsgTurqu36RuGJLAxWMw6H/wpEmslAs2E96PfOveW2lzp3JSvvfouCo6cASfOx/Ygb0asoWViAEaRncpf7wBgZ5uXRcgaha4S1bkru/mPlzrZNDcLpeNd4uj12ne9+Qq20uebiUtuiOiSQsWan1wKobjXRduolWGMbsvzml8/2XZR/vSA9kz+e/ozOD1+NbjJ6j1sIBn3yMEn3TuDwT2swWM20mDSYsOaNSx3nb91ESokjx//vT6GoKVRagzpIZMeEUoupf6bxoM4M/uThgHysjy3bzC+Tny6VS/7Q7BVk7TgIAXqsIAQxfTr6TU7WZsrFbH15Bq4/jdkQamHwZ9MoSM9k9f3vlCnyY9e9R0yPdj73OU7nc2j2ChynC2h6cXciS2RnTL5/Evtm/OIltkLXaXf9SCwxUbS64kK2vT6LP/71abHrpO1ENpufn86JVTsYPu/f+KNR98TiqFRfNBnazVNf4E9vC9LposmQrn7OUihqDhULXQcxhlrpOu0abw8PIWh7w0hG//JqwEE0Gx//xKtYiHS6yEk5Qq/nbyEkLhpDmBVjeAimqDC6PvEXDKEWtKLZrW41YYoKZeBHDwKQuXU/y254kdm9buP3m14ia8dBIts1p/fLt6NbTOgWU3EumtZTLiZh/IDyfdKFwOKnSPjhn1YzvdkVrLjjddY8+B4/dLuF5be+Uhz52qBTK4ZOfwxzdCSGcCuGUAuhCY0ZufAlLDFRABisZk6u2+X14HQV2Di2dFOp1AkVpdfzt2AMs5bysjGEWmh38+hzqnalUFQ1qpB3HUVKyZ5P5rP52S/IS8sgom0cPZ+9qdj7I1C+jB6P/dRpn/va334Z/d66m1Ob9uK2O2nUIxHNaCA39Ti7PphL9q5UYnp3IPHGkVgaRZK2YB2LJzxeXFBaGHR0k4Fhc56l6dDu5B0+wYFZv+EqtNN8TN/iUoE5e4/wfeeb/JqGQuKiufLQdK/857ZTOcxIuMprlm4ItdDv3ftoe93w4m1ul4vMzfvQjAaiklt6tfV17AQKT3hnt9QsJi544VaS7r68/Jvph5yUNDY98wVHlmzE0jiKTvdNpPWUYSqfu6LGKGvhVYl8kDO9+WQK0jJ87mvUI5HL1r0fUDtSSmY2n0z+kZNe+8JaNmHS3i/KFLW1D33Ajne+98oiqVtNjFz8Co37Jnmds/ODOax94D2fBVgqMnaAb5OuJ3tnqtd2Y7iV/h8+QOvJQwNuS6Goa5Ql8spcE+Q06uHfnlyW3f/P5KSkYfeRjAugIP0Uean+C40DXPDiX7lo1pM0vbgHIXHRRLRvTvL9k5i46zOfAg+eKF+XHzdSm5+3E38k3zfJtxeSplX47UihOJ9QC69BTrsbRnJkwTovn3vNaCDuEp8Pfp/oZv/l86RbFtvwz5CxbhebX5xO9o5DNOzeli4PX038yN7Ejyw3XKKY2MFd0C0mL191YdBpdknPgNsBaHfzaDI27GbvZwuL3SGFQWf4vOcwWM0VakuhOJ9QIh/kNB/bj8j2zcnelVos9ELTMIRbSb5vYsDthCXEEtE2jsxtB0p7kghBg+SWhDRpWLzpwHe/89t1zxXnssneeYhD3/7OsDnPeHKrB0jjfkk0HtCJ9GVbzi4eF6Xo7fqPKQG3A55rHvD+3+jyyDWkL9uCuUEYzS7p5dN9UqEIJpRNvh7gOJ3Phsc+Zu8Xi3DZHcSP6k2v52+pcJrbzG0H+HHwvbhtTpz5hRhCLegWE6OXvUFUB09yObfLxfSmk7Bl5HidH96mGRN3f1ahBUmX3cG2V//Hrg/m4MgrJG7kBfR48nqVolehKIFaeFVUGfbsXPZ+uYjMrQdo0Lk1baZcjCnibGKyzK37mdv/bp8RsJrZyBX7vyo161coFJWnNtIaKIIUU2QYHe8Y73e/bjX7rRGLlOhmZR5RKGoS5V2jqFIi2jQjrGWsVwoEoWnE9OmIuUF4LY1MoaifKJFXVDlDZz6BqcHZnOyGMCuWxlEM+vSRWh6ZQlH/UOYaRZXTILklV+7/iv0zfiFrVyoNO7em5RUXKldFhaIWUCKvqBaM4SG0u3lMbQ9Doaj3KHONQqFQBDFK5BUKhSKIUSKvUCgUQYwSeYVCoQhilMgrFApFEFOn0hoIIU4AB2uou2jAd6L1+oO6Bx7UfVD3AM7ve9BCShnja0edEvmaRAixzl+uh/qCugce1H1Q9wCC9x4oc41CoVAEMUrkFQqFIoipzyL/YW0PoA6g7oEHdR/UPYAgvQf11iavUCgU9YH6PJNXKBSKoEeJvEKhUAQx9VbkhRAPCiGkECK66LMQQrwphEgRQmwWQvSo7TFWF0KIl4QQO4uu8zshRFSJfdOK7sEuIcSI2hxndSOEGFl0nSlCiHqR7F4I0VwI8YsQYocQYpsQ4t6i7Q2FEAuFEHuK/m9Q22OtboQQuhBioxBibtHnVkKI1UX3YIYQwlTbY6wK6qXICyGaA8OBQyU2jwISi/7dCrxXC0OrKRYCnaSUXYDdwDQAIUQScBWQDIwE3hVC6LU2ymqk6LrewfN7TwKuLrr+YMcJPCCl7Aj0Be4suu5HgMVSykRgcdHnYOdeYEeJzy8ArxXdg0zgploZVRVTL0UeeA14CCi56jwO+Ex6WAVECSGa1sroqhkp5QIppbPo4yogvujnccB0KaVNSrkfSAF618YYa4DeQIqUcp+U0g5Mx3P9QY2U8qiUckPRz6fxiFwcnmv/tOiwTwH/hXyDACFEPDAG+KjoswAuAv5XdEjQ3IN6J/JCiMuANCnlpj/tigNSS3w+XLQt2LkR+Kno5/p0D+rTtfpECNES6A6sBmKllEfB8yAAGtfeyGqE1/FM9M5UnW8EZJWY/ATN9yEoK0MJIRYBTXzs+ifwD+ASX6f52Hbe+peWdQ+klD8UHfNPPK/vX545zcfx5+09KIf6dK1eCCHCgFnAfVLKHCF83Y7gRAgxFjgupVwvhBhyZrOPQ4Pi+xCUIi+lHOZruxCiM9AK2FT0pY4HNggheuN5cjcvcXg8cKSah1pt+LsHZxBCTAXGAhfLs8ESQXUPyqE+XWsphBBGPAL/pZTy26LN6UKIplLKo0VmyuO1N8JqZwBwmRBiNGABIvDM7KOEEIai2XzQfB/qlblGSrlFStlYStlSStkSzx96DynlMWA28JciL5u+QPaZ19dgQwgxEngYuExKmV9i12zgKiGEWQjRCs8i9JraGGMNsBZILPKoMOFZcJ5dy2Oqdopsz/8BdkgpXy2xazYwtejnqcAPNT22mkJKOU1KGV+kAVcBS6SUU4BfgElFhwXNPQjKmfw58iMwGs9iYz5wQ+0Op1p5GzADC4veaFZJKW+TUm4TQswEtuMx49wppXTV4jirDSmlUwhxFzAf0IH/Sim31fKwaoIBwHXAFiHEH0Xb/gE8D8wUQtyEx+vsiloaX23yMDBdCPEMsBHPw/C8R6U1UCgUiiCmXplrFAqFor6hRF6hUCiCGCXyCoVCEcQokVcoFIogRom8QqFQBDFK5BUKhSKIUSKvUCgUQcz/A/Ip5x2EmzGFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 读取数据集以及相关参数\n",
    "global TRAIN_SET\n",
    "global TEST_SET\n",
    "global DATA_DIM\n",
    "global CLASSES\n",
    "TRAIN_SET, TEST_SET, DATA_DIM = get_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def read_data(data_set):\n",
    "    \"\"\"\n",
    "    构造reader\n",
    "    :param data_set: 要获取的数据的数据集\n",
    "    :return: reader: 用户返回训练数据及数据标签的生成器(generator)\n",
    "    \"\"\"\n",
    "    def reader():\n",
    "        \"\"\"\n",
    "        一个reader生成器\n",
    "        :return: 每次训练数据及数据标签\n",
    "        data[:-1]: 训练数据\n",
    "        data[-1:]: 数据标签\n",
    "        \"\"\"\n",
    "        for data in data_set:\n",
    "            yield data[:-1], data[-1:]\n",
    "    return reader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义buf_size和batch_size大小\n",
    "buf_size = 100\n",
    "batch_size = 50\n",
    "\n",
    "# 定义reader\n",
    "train_reader = paddle.batch(\n",
    "    reader=paddle.reader.shuffle(\n",
    "        reader=read_data(TRAIN_SET),\n",
    "        buf_size=buf_size\n",
    "    ),\n",
    "    batch_size=batch_size\n",
    ")\n",
    "\n",
    "test_reader = paddle.batch(\n",
    "    reader=paddle.reader.shuffle(\n",
    "        reader=read_data(TEST_SET),\n",
    "        buf_size=buf_size\n",
    "    ),\n",
    "    batch_size=batch_size\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 配置网络结构\n",
    "class net(fluid.dygraph.Layer):\n",
    "    def __init__(self, name_scope):\n",
    "        super(net, self).__init__(name_scope)\n",
    "        # 隐藏层，全连接层，输出大小为4，激活函数为tanh\n",
    "        self.h1 = Linear(input_dim=DATA_DIM, output_dim=4, act='tanh')\n",
    "        # 输出层，全连接层，输出大小为2，对应结果的两个类别，激活函数为softmax\n",
    "        self.fc = Linear(input_dim=4, output_dim=2, act='softmax')\n",
    "\n",
    "        \n",
    "    \n",
    "    # 网络的前向计算函数\n",
    "    def forward(self, x):\n",
    "        x = self.h1(x)\n",
    "        x = self.fc(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义飞桨动态图工作环境\n",
    "with fluid.dygraph.guard():\n",
    "    # 实例化模型\n",
    "    # Softmax分类器\n",
    "    model = net('classification')\n",
    "    \n",
    "    # 开启模型训练模式\n",
    "    model.train()\n",
    "    # 使用Adam优化器\n",
    "    # 学习率为0.0001\n",
    "    opt = fluid.optimizer.Adam(learning_rate=0.01, parameter_list=model.parameters())\n",
    "    # 迭代次数设为100\n",
    "    EPOCH_NUM = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with fluid.dygraph.guard():\n",
    "    # 记录每次的损失值，用于绘图\n",
    "    costs = []\n",
    "    # 定义外层循环\n",
    "    for pass_num in range(EPOCH_NUM):\n",
    "        # 定义内层循环\n",
    "        for batch_id,data in enumerate(train_reader()):\n",
    "            # 调整数据shape使之适合模型\n",
    "            images = np.array([x[0].reshape(DATA_DIM) for x in data],np.float32)\n",
    "            labels = np.array([x[1] for x in data]).astype('int64').reshape(-1,1)\n",
    "            \n",
    "            # 将numpy数据转为飞桨动态图variable形式\n",
    "            image = fluid.dygraph.to_variable(images)\n",
    "            label = fluid.dygraph.to_variable(labels)\n",
    "            \n",
    "            # 前向计算\n",
    "            predict = model(image)\n",
    "\n",
    "            # 计算损失\n",
    "            # 使用交叉熵损失函数\n",
    "            loss = fluid.layers.cross_entropy(predict,label)\n",
    "            avg_loss = fluid.layers.mean(loss)\n",
    "\n",
    "            # 计算精度\n",
    "            # acc = fluid.layers.accuracy(predict,label)\n",
    "            \n",
    "            # 绘图\n",
    "            if batch_id % 100 == 0:\n",
    "                costs.append(avg_loss.numpy()[0])\n",
    "                draw_line(costs, 0.01)\n",
    "\n",
    "            # 反向传播\n",
    "            avg_loss.backward()\n",
    "            # 最小化loss,更新参数\n",
    "            opt.minimize(avg_loss)\n",
    "            # 清除梯度\n",
    "            model.clear_gradients()\n",
    "\n",
    "    # 保存模型文件到指定路径\n",
    "    fluid.save_dygraph(model.state_dict(), 'classification')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "index 1, truth 0, infer 1\n",
      "index 2, truth 0, infer 1\n",
      "index 3, truth 0, infer 1\n",
      "index 4, truth 0, infer 1\n",
      "index 5, truth 0, infer 1\n",
      "index 6, truth 0, infer 1\n",
      "index 7, truth 0, infer 1\n",
      "index 8, truth 0, infer 1\n",
      "index 9, truth 0, infer 1\n",
      "index 10, truth 0, infer 1\n",
      "index 11, truth 0, infer 0\n",
      "index 12, truth 0, infer 1\n",
      "index 13, truth 0, infer 1\n",
      "index 14, truth 0, infer 1\n",
      "index 15, truth 0, infer 1\n",
      "index 16, truth 0, infer 1\n",
      "index 17, truth 0, infer 1\n",
      "index 18, truth 0, infer 1\n",
      "index 19, truth 0, infer 1\n",
      "index 20, truth 0, infer 1\n",
      "index 21, truth 0, infer 1\n",
      "index 22, truth 0, infer 1\n",
      "index 23, truth 0, infer 1\n",
      "index 24, truth 0, infer 1\n",
      "index 25, truth 0, infer 1\n",
      "index 26, truth 0, infer 1\n",
      "index 27, truth 0, infer 1\n",
      "index 28, truth 0, infer 1\n",
      "index 29, truth 0, infer 1\n",
      "index 30, truth 0, infer 1\n",
      "index 31, truth 0, infer 1\n",
      "index 32, truth 0, infer 1\n",
      "index 33, truth 0, infer 1\n",
      "index 34, truth 0, infer 1\n",
      "index 35, truth 0, infer 1\n",
      "index 36, truth 0, infer 1\n",
      "index 37, truth 0, infer 1\n",
      "index 38, truth 0, infer 1\n",
      "index 39, truth 0, infer 1\n",
      "index 40, truth 0, infer 1\n",
      "index 41, truth 0, infer 1\n",
      "index 42, truth 0, infer 1\n",
      "index 43, truth 0, infer 1\n",
      "index 44, truth 0, infer 1\n",
      "index 45, truth 0, infer 1\n",
      "index 46, truth 0, infer 1\n",
      "index 47, truth 0, infer 1\n",
      "index 48, truth 0, infer 1\n",
      "index 49, truth 0, infer 1\n",
      "index 50, truth 0, infer 1\n",
      "index 51, truth 0, infer 1\n",
      "index 52, truth 0, infer 1\n",
      "index 53, truth 0, infer 1\n",
      "index 54, truth 0, infer 1\n",
      "index 55, truth 0, infer 1\n",
      "index 56, truth 0, infer 1\n",
      "index 57, truth 0, infer 1\n",
      "index 58, truth 0, infer 1\n",
      "index 59, truth 0, infer 0\n",
      "index 60, truth 0, infer 1\n",
      "index 61, truth 0, infer 1\n",
      "index 62, truth 0, infer 1\n",
      "index 63, truth 0, infer 1\n",
      "index 64, truth 0, infer 1\n",
      "index 65, truth 0, infer 1\n",
      "index 66, truth 0, infer 1\n",
      "index 67, truth 0, infer 1\n",
      "index 68, truth 0, infer 1\n",
      "index 69, truth 0, infer 1\n",
      "index 70, truth 0, infer 1\n",
      "index 71, truth 0, infer 1\n",
      "index 72, truth 0, infer 1\n",
      "index 73, truth 0, infer 1\n",
      "index 74, truth 0, infer 1\n",
      "index 75, truth 0, infer 1\n",
      "index 76, truth 0, infer 1\n",
      "index 77, truth 0, infer 1\n",
      "index 78, truth 0, infer 1\n",
      "index 79, truth 0, infer 1\n",
      "index 80, truth 0, infer 1\n",
      "index 81, truth 0, infer 1\n",
      "index 82, truth 0, infer 1\n",
      "index 83, truth 0, infer 1\n",
      "index 84, truth 0, infer 1\n",
      "index 85, truth 0, infer 1\n",
      "index 86, truth 0, infer 1\n",
      "index 87, truth 0, infer 1\n",
      "index 88, truth 0, infer 0\n",
      "index 89, truth 0, infer 1\n",
      "index 90, truth 0, infer 1\n",
      "index 91, truth 0, infer 1\n",
      "index 92, truth 0, infer 1\n",
      "index 93, truth 0, infer 1\n",
      "index 94, truth 0, infer 1\n",
      "index 95, truth 0, infer 1\n",
      "index 96, truth 0, infer 1\n",
      "index 97, truth 0, infer 1\n",
      "index 98, truth 0, infer 1\n",
      "index 99, truth 0, infer 1\n",
      "index 100, truth 0, infer 1\n",
      "index 101, truth 0, infer 0\n",
      "index 102, truth 0, infer 0\n",
      "index 103, truth 0, infer 0\n",
      "index 104, truth 0, infer 1\n",
      "index 105, truth 0, infer 0\n",
      "index 106, truth 0, infer 0\n",
      "index 107, truth 0, infer 0\n",
      "index 108, truth 0, infer 0\n",
      "index 109, truth 0, infer 0\n",
      "index 110, truth 0, infer 0\n",
      "index 111, truth 0, infer 1\n",
      "index 112, truth 0, infer 0\n",
      "index 113, truth 0, infer 0\n",
      "index 114, truth 0, infer 0\n",
      "index 115, truth 0, infer 0\n",
      "index 116, truth 0, infer 1\n",
      "index 117, truth 0, infer 0\n",
      "index 118, truth 0, infer 1\n",
      "index 119, truth 0, infer 0\n",
      "index 120, truth 0, infer 0\n",
      "index 121, truth 0, infer 0\n",
      "index 122, truth 0, infer 1\n",
      "index 123, truth 0, infer 0\n",
      "index 124, truth 0, infer 0\n",
      "index 125, truth 0, infer 1\n",
      "index 126, truth 0, infer 0\n",
      "index 127, truth 0, infer 0\n",
      "index 128, truth 0, infer 1\n",
      "index 129, truth 0, infer 0\n",
      "index 130, truth 0, infer 0\n",
      "index 131, truth 0, infer 0\n",
      "index 132, truth 0, infer 0\n",
      "index 133, truth 0, infer 0\n",
      "index 134, truth 0, infer 0\n",
      "index 135, truth 0, infer 0\n",
      "index 136, truth 0, infer 0\n",
      "index 137, truth 0, infer 0\n",
      "index 138, truth 0, infer 0\n",
      "index 139, truth 0, infer 0\n",
      "index 140, truth 0, infer 1\n",
      "index 141, truth 0, infer 0\n",
      "index 142, truth 0, infer 0\n",
      "index 143, truth 0, infer 1\n",
      "index 144, truth 0, infer 0\n",
      "index 145, truth 0, infer 1\n",
      "index 146, truth 0, infer 0\n",
      "index 147, truth 0, infer 0\n",
      "index 148, truth 0, infer 0\n",
      "index 149, truth 0, infer 1\n",
      "index 150, truth 0, infer 1\n",
      "index 151, truth 0, infer 1\n",
      "index 152, truth 0, infer 1\n",
      "index 153, truth 0, infer 0\n",
      "index 154, truth 0, infer 0\n",
      "index 155, truth 0, infer 0\n",
      "index 156, truth 0, infer 0\n",
      "index 157, truth 0, infer 1\n",
      "index 158, truth 0, infer 1\n",
      "index 159, truth 0, infer 0\n",
      "index 160, truth 0, infer 0\n",
      "index 161, truth 0, infer 0\n",
      "index 162, truth 0, infer 1\n",
      "index 163, truth 0, infer 0\n",
      "index 164, truth 0, infer 0\n",
      "index 165, truth 0, infer 0\n",
      "index 166, truth 0, infer 0\n",
      "index 167, truth 0, infer 1\n",
      "index 168, truth 0, infer 0\n",
      "index 169, truth 0, infer 0\n",
      "index 170, truth 0, infer 1\n",
      "index 171, truth 0, infer 0\n",
      "index 172, truth 0, infer 0\n",
      "index 173, truth 0, infer 1\n",
      "index 174, truth 0, infer 0\n",
      "index 175, truth 0, infer 0\n",
      "index 176, truth 0, infer 0\n",
      "index 177, truth 0, infer 0\n",
      "index 178, truth 0, infer 1\n",
      "index 179, truth 0, infer 1\n",
      "index 180, truth 0, infer 1\n",
      "index 181, truth 0, infer 0\n",
      "index 182, truth 0, infer 1\n",
      "index 183, truth 0, infer 0\n",
      "index 184, truth 0, infer 1\n",
      "index 185, truth 0, infer 0\n",
      "index 186, truth 0, infer 0\n",
      "index 187, truth 0, infer 0\n",
      "index 188, truth 0, infer 0\n",
      "index 189, truth 0, infer 1\n",
      "index 190, truth 0, infer 0\n",
      "index 191, truth 0, infer 0\n",
      "index 192, truth 0, infer 0\n",
      "index 193, truth 0, infer 0\n",
      "index 194, truth 0, infer 0\n",
      "index 195, truth 0, infer 0\n",
      "index 196, truth 0, infer 0\n",
      "index 197, truth 0, infer 0\n",
      "index 198, truth 0, infer 0\n",
      "index 199, truth 0, infer 0\n",
      "index 200, truth 0, infer 0\n",
      "index 201, truth 0, infer 0\n",
      "index 202, truth 0, infer 0\n",
      "index 203, truth 0, infer 0\n",
      "index 204, truth 0, infer 0\n",
      "index 205, truth 0, infer 0\n",
      "index 206, truth 0, infer 0\n",
      "index 207, truth 0, infer 0\n",
      "index 208, truth 0, infer 0\n",
      "index 209, truth 0, infer 0\n",
      "index 210, truth 0, infer 0\n",
      "index 211, truth 0, infer 0\n",
      "index 212, truth 0, infer 0\n",
      "index 213, truth 0, infer 0\n",
      "index 214, truth 0, infer 0\n",
      "index 215, truth 0, infer 0\n",
      "index 216, truth 0, infer 0\n",
      "index 217, truth 0, infer 0\n",
      "index 218, truth 0, infer 0\n",
      "index 219, truth 0, infer 0\n",
      "index 220, truth 0, infer 0\n",
      "index 221, truth 0, infer 0\n",
      "index 222, truth 0, infer 0\n",
      "index 223, truth 0, infer 0\n",
      "index 224, truth 0, infer 0\n",
      "index 225, truth 0, infer 0\n",
      "index 226, truth 0, infer 0\n",
      "index 227, truth 0, infer 0\n",
      "index 228, truth 0, infer 0\n",
      "index 229, truth 0, infer 0\n",
      "index 230, truth 0, infer 0\n",
      "index 231, truth 0, infer 0\n",
      "index 232, truth 0, infer 0\n",
      "index 233, truth 0, infer 0\n",
      "index 234, truth 0, infer 0\n",
      "index 235, truth 0, infer 0\n",
      "index 236, truth 0, infer 0\n",
      "index 237, truth 0, infer 0\n",
      "index 238, truth 0, infer 0\n",
      "index 239, truth 0, infer 0\n",
      "index 240, truth 0, infer 0\n",
      "index 241, truth 0, infer 0\n",
      "index 242, truth 0, infer 0\n",
      "index 243, truth 0, infer 0\n",
      "index 244, truth 0, infer 0\n",
      "index 245, truth 0, infer 0\n",
      "index 246, truth 0, infer 0\n",
      "index 247, truth 0, infer 0\n",
      "index 248, truth 0, infer 0\n",
      "index 249, truth 0, infer 0\n",
      "index 250, truth 0, infer 0\n",
      "index 251, truth 0, infer 0\n",
      "index 252, truth 0, infer 0\n",
      "index 253, truth 0, infer 0\n",
      "index 254, truth 0, infer 0\n",
      "index 255, truth 0, infer 0\n",
      "index 256, truth 0, infer 0\n",
      "index 257, truth 0, infer 0\n",
      "index 258, truth 0, infer 0\n",
      "index 259, truth 0, infer 0\n",
      "index 260, truth 0, infer 0\n",
      "index 261, truth 0, infer 0\n",
      "index 262, truth 0, infer 0\n",
      "index 263, truth 0, infer 0\n",
      "index 264, truth 0, infer 0\n",
      "index 265, truth 0, infer 0\n",
      "index 266, truth 0, infer 0\n",
      "index 267, truth 0, infer 0\n",
      "index 268, truth 0, infer 0\n",
      "index 269, truth 0, infer 0\n",
      "index 270, truth 0, infer 0\n",
      "index 271, truth 0, infer 0\n",
      "index 272, truth 0, infer 0\n",
      "index 273, truth 0, infer 0\n",
      "index 274, truth 0, infer 0\n",
      "index 275, truth 0, infer 0\n",
      "index 276, truth 0, infer 0\n",
      "index 277, truth 0, infer 0\n",
      "index 278, truth 0, infer 0\n",
      "index 279, truth 0, infer 0\n",
      "index 280, truth 0, infer 0\n",
      "index 281, truth 0, infer 0\n",
      "index 282, truth 0, infer 0\n",
      "index 283, truth 0, infer 0\n",
      "index 284, truth 0, infer 0\n",
      "index 285, truth 0, infer 0\n",
      "index 286, truth 0, infer 0\n",
      "index 287, truth 0, infer 0\n",
      "index 288, truth 0, infer 0\n",
      "index 289, truth 0, infer 0\n",
      "index 290, truth 0, infer 0\n",
      "index 291, truth 0, infer 0\n",
      "index 292, truth 0, infer 0\n",
      "index 293, truth 0, infer 0\n",
      "index 294, truth 0, infer 0\n",
      "index 295, truth 0, infer 0\n",
      "index 296, truth 0, infer 0\n",
      "index 297, truth 0, infer 0\n",
      "index 298, truth 0, infer 0\n",
      "index 299, truth 0, infer 0\n",
      "index 300, truth 0, infer 0\n",
      "index 301, truth 0, infer 0\n",
      "index 302, truth 0, infer 0\n",
      "index 303, truth 0, infer 0\n",
      "index 304, truth 0, infer 0\n",
      "index 305, truth 0, infer 0\n",
      "index 306, truth 0, infer 0\n",
      "index 307, truth 0, infer 0\n",
      "index 308, truth 0, infer 0\n",
      "index 309, truth 0, infer 0\n",
      "index 310, truth 0, infer 0\n",
      "index 311, truth 0, infer 0\n",
      "index 312, truth 0, infer 0\n",
      "index 313, truth 0, infer 0\n",
      "index 314, truth 0, infer 0\n",
      "index 315, truth 0, infer 0\n",
      "index 316, truth 0, infer 0\n",
      "index 317, truth 0, infer 0\n",
      "index 318, truth 0, infer 0\n",
      "index 319, truth 0, infer 0\n",
      "index 320, truth 0, infer 0\n",
      "index 321, truth 0, infer 0\n",
      "index 322, truth 0, infer 0\n",
      "index 323, truth 0, infer 0\n",
      "index 324, truth 0, infer 0\n",
      "index 325, truth 0, infer 0\n",
      "index 326, truth 0, infer 0\n",
      "index 327, truth 0, infer 0\n",
      "index 328, truth 0, infer 0\n",
      "index 329, truth 0, infer 0\n",
      "index 330, truth 0, infer 0\n",
      "index 331, truth 0, infer 0\n",
      "index 332, truth 0, infer 0\n",
      "index 333, truth 0, infer 0\n",
      "index 334, truth 0, infer 0\n",
      "index 335, truth 0, infer 0\n",
      "index 336, truth 0, infer 0\n",
      "index 337, truth 0, infer 0\n",
      "index 338, truth 0, infer 0\n",
      "index 339, truth 0, infer 0\n",
      "index 340, truth 0, infer 0\n",
      "index 341, truth 0, infer 0\n",
      "index 342, truth 0, infer 0\n",
      "index 343, truth 0, infer 0\n",
      "index 344, truth 0, infer 0\n",
      "index 345, truth 0, infer 0\n",
      "index 346, truth 0, infer 0\n",
      "index 347, truth 0, infer 0\n",
      "index 348, truth 0, infer 0\n",
      "index 349, truth 0, infer 0\n",
      "index 350, truth 0, infer 0\n",
      "index 351, truth 0, infer 0\n",
      "index 352, truth 0, infer 0\n",
      "index 353, truth 0, infer 0\n",
      "index 354, truth 0, infer 0\n",
      "index 355, truth 0, infer 0\n",
      "index 356, truth 0, infer 0\n",
      "index 357, truth 0, infer 0\n",
      "index 358, truth 0, infer 0\n",
      "index 359, truth 0, infer 0\n",
      "index 360, truth 0, infer 0\n",
      "index 361, truth 0, infer 0\n",
      "index 362, truth 0, infer 0\n",
      "index 363, truth 0, infer 0\n",
      "index 364, truth 0, infer 0\n",
      "index 365, truth 0, infer 0\n",
      "index 366, truth 0, infer 0\n",
      "index 367, truth 0, infer 0\n",
      "index 368, truth 0, infer 0\n",
      "index 369, truth 0, infer 0\n",
      "index 370, truth 0, infer 0\n",
      "index 371, truth 0, infer 0\n",
      "index 372, truth 0, infer 0\n",
      "index 373, truth 0, infer 0\n",
      "index 374, truth 0, infer 0\n",
      "index 375, truth 0, infer 0\n",
      "index 376, truth 0, infer 0\n",
      "index 377, truth 0, infer 0\n",
      "index 378, truth 0, infer 0\n",
      "index 379, truth 0, infer 0\n",
      "index 380, truth 0, infer 0\n",
      "index 381, truth 0, infer 0\n",
      "index 382, truth 0, infer 0\n",
      "index 383, truth 0, infer 0\n",
      "index 384, truth 0, infer 0\n",
      "index 385, truth 0, infer 0\n",
      "index 386, truth 0, infer 0\n",
      "index 387, truth 0, infer 0\n",
      "index 388, truth 0, infer 0\n",
      "index 389, truth 0, infer 0\n",
      "index 390, truth 0, infer 0\n",
      "index 391, truth 0, infer 0\n",
      "index 392, truth 0, infer 0\n",
      "index 393, truth 0, infer 0\n",
      "index 394, truth 0, infer 0\n",
      "index 395, truth 0, infer 0\n",
      "index 396, truth 0, infer 0\n",
      "index 397, truth 0, infer 0\n",
      "index 398, truth 0, infer 0\n",
      "index 399, truth 0, infer 0\n",
      "index 400, truth 0, infer 0\n",
      "index 401, truth 1, infer 1\n",
      "index 402, truth 1, infer 1\n",
      "index 403, truth 1, infer 1\n",
      "index 404, truth 1, infer 1\n",
      "index 405, truth 1, infer 1\n",
      "index 406, truth 1, infer 1\n",
      "index 407, truth 1, infer 1\n",
      "index 408, truth 1, infer 1\n",
      "index 409, truth 1, infer 1\n",
      "index 410, truth 1, infer 1\n",
      "index 411, truth 1, infer 1\n",
      "index 412, truth 1, infer 1\n",
      "index 413, truth 1, infer 1\n",
      "index 414, truth 1, infer 1\n",
      "index 415, truth 1, infer 1\n",
      "index 416, truth 1, infer 1\n",
      "index 417, truth 1, infer 1\n",
      "index 418, truth 1, infer 1\n",
      "index 419, truth 1, infer 1\n",
      "index 420, truth 1, infer 1\n",
      "index 421, truth 1, infer 1\n",
      "index 422, truth 1, infer 1\n",
      "index 423, truth 1, infer 1\n",
      "index 424, truth 1, infer 1\n",
      "index 425, truth 1, infer 1\n",
      "index 426, truth 1, infer 1\n",
      "index 427, truth 1, infer 1\n",
      "index 428, truth 1, infer 1\n",
      "index 429, truth 1, infer 1\n",
      "index 430, truth 1, infer 1\n",
      "index 431, truth 1, infer 1\n",
      "index 432, truth 1, infer 1\n",
      "index 433, truth 1, infer 1\n",
      "index 434, truth 1, infer 1\n",
      "index 435, truth 1, infer 1\n",
      "index 436, truth 1, infer 1\n",
      "index 437, truth 1, infer 1\n",
      "index 438, truth 1, infer 1\n",
      "index 439, truth 1, infer 1\n",
      "index 440, truth 1, infer 1\n",
      "index 441, truth 1, infer 1\n",
      "index 442, truth 1, infer 1\n",
      "index 443, truth 1, infer 1\n",
      "index 444, truth 1, infer 1\n",
      "index 445, truth 1, infer 1\n",
      "index 446, truth 1, infer 1\n",
      "index 447, truth 1, infer 1\n",
      "index 448, truth 1, infer 1\n",
      "index 449, truth 1, infer 1\n",
      "index 450, truth 1, infer 1\n",
      "index 451, truth 1, infer 1\n",
      "index 452, truth 1, infer 1\n",
      "index 453, truth 1, infer 1\n",
      "index 454, truth 1, infer 1\n",
      "index 455, truth 1, infer 1\n",
      "index 456, truth 1, infer 1\n",
      "index 457, truth 1, infer 1\n",
      "index 458, truth 1, infer 1\n",
      "index 459, truth 1, infer 1\n",
      "index 460, truth 1, infer 1\n",
      "index 461, truth 1, infer 1\n",
      "index 462, truth 1, infer 1\n",
      "index 463, truth 1, infer 1\n",
      "index 464, truth 1, infer 1\n",
      "index 465, truth 1, infer 1\n",
      "index 466, truth 1, infer 1\n",
      "index 467, truth 1, infer 1\n",
      "index 468, truth 1, infer 1\n",
      "index 469, truth 1, infer 1\n",
      "index 470, truth 1, infer 1\n",
      "index 471, truth 1, infer 1\n",
      "index 472, truth 1, infer 1\n",
      "index 473, truth 1, infer 1\n",
      "index 474, truth 1, infer 1\n",
      "index 475, truth 1, infer 1\n",
      "index 476, truth 1, infer 1\n",
      "index 477, truth 1, infer 1\n",
      "index 478, truth 1, infer 1\n",
      "index 479, truth 1, infer 1\n",
      "index 480, truth 1, infer 1\n",
      "index 481, truth 1, infer 1\n",
      "index 482, truth 1, infer 1\n",
      "index 483, truth 1, infer 1\n",
      "index 484, truth 1, infer 1\n",
      "index 485, truth 1, infer 1\n",
      "index 486, truth 1, infer 1\n",
      "index 487, truth 1, infer 1\n",
      "index 488, truth 1, infer 1\n",
      "index 489, truth 1, infer 1\n",
      "index 490, truth 1, infer 1\n",
      "index 491, truth 1, infer 1\n",
      "index 492, truth 1, infer 1\n",
      "index 493, truth 1, infer 1\n",
      "index 494, truth 1, infer 1\n",
      "index 495, truth 1, infer 1\n",
      "index 496, truth 1, infer 1\n",
      "index 497, truth 1, infer 1\n",
      "index 498, truth 1, infer 1\n",
      "index 499, truth 1, infer 1\n",
      "index 500, truth 1, infer 1\n",
      "index 501, truth 1, infer 1\n",
      "index 502, truth 1, infer 1\n",
      "index 503, truth 1, infer 1\n",
      "index 504, truth 1, infer 1\n",
      "index 505, truth 1, infer 1\n",
      "index 506, truth 1, infer 1\n",
      "index 507, truth 1, infer 1\n",
      "index 508, truth 1, infer 1\n",
      "index 509, truth 1, infer 1\n",
      "index 510, truth 1, infer 1\n",
      "index 511, truth 1, infer 1\n",
      "index 512, truth 1, infer 1\n",
      "index 513, truth 1, infer 1\n",
      "index 514, truth 1, infer 1\n",
      "index 515, truth 1, infer 1\n",
      "index 516, truth 1, infer 1\n",
      "index 517, truth 1, infer 1\n",
      "index 518, truth 1, infer 1\n",
      "index 519, truth 1, infer 1\n",
      "index 520, truth 1, infer 1\n",
      "index 521, truth 1, infer 1\n",
      "index 522, truth 1, infer 1\n",
      "index 523, truth 1, infer 1\n",
      "index 524, truth 1, infer 1\n",
      "index 525, truth 1, infer 1\n",
      "index 526, truth 1, infer 1\n",
      "index 527, truth 1, infer 1\n",
      "index 528, truth 1, infer 1\n",
      "index 529, truth 1, infer 1\n",
      "index 530, truth 1, infer 1\n",
      "index 531, truth 1, infer 1\n",
      "index 532, truth 1, infer 1\n",
      "index 533, truth 1, infer 1\n",
      "index 534, truth 1, infer 1\n",
      "index 535, truth 1, infer 1\n",
      "index 536, truth 1, infer 1\n",
      "index 537, truth 1, infer 1\n",
      "index 538, truth 1, infer 1\n",
      "index 539, truth 1, infer 1\n",
      "index 540, truth 1, infer 1\n",
      "index 541, truth 1, infer 1\n",
      "index 542, truth 1, infer 1\n",
      "index 543, truth 1, infer 1\n",
      "index 544, truth 1, infer 1\n",
      "index 545, truth 1, infer 1\n",
      "index 546, truth 1, infer 1\n",
      "index 547, truth 1, infer 1\n",
      "index 548, truth 1, infer 1\n",
      "index 549, truth 1, infer 1\n",
      "index 550, truth 1, infer 1\n",
      "index 551, truth 1, infer 1\n",
      "index 552, truth 1, infer 1\n",
      "index 553, truth 1, infer 1\n",
      "index 554, truth 1, infer 1\n",
      "index 555, truth 1, infer 1\n",
      "index 556, truth 1, infer 1\n",
      "index 557, truth 1, infer 1\n",
      "index 558, truth 1, infer 1\n",
      "index 559, truth 1, infer 1\n",
      "index 560, truth 1, infer 1\n",
      "index 561, truth 1, infer 1\n",
      "index 562, truth 1, infer 1\n",
      "index 563, truth 1, infer 1\n",
      "index 564, truth 1, infer 1\n",
      "index 565, truth 1, infer 1\n",
      "index 566, truth 1, infer 1\n",
      "index 567, truth 1, infer 1\n",
      "index 568, truth 1, infer 1\n",
      "index 569, truth 1, infer 1\n",
      "index 570, truth 1, infer 1\n",
      "index 571, truth 1, infer 1\n",
      "index 572, truth 1, infer 1\n",
      "index 573, truth 1, infer 1\n",
      "index 574, truth 1, infer 1\n",
      "index 575, truth 1, infer 1\n",
      "index 576, truth 1, infer 1\n",
      "index 577, truth 1, infer 1\n",
      "index 578, truth 1, infer 1\n",
      "index 579, truth 1, infer 1\n",
      "index 580, truth 1, infer 1\n",
      "index 581, truth 1, infer 1\n",
      "index 582, truth 1, infer 1\n",
      "index 583, truth 1, infer 1\n",
      "index 584, truth 1, infer 1\n",
      "index 585, truth 1, infer 1\n",
      "index 586, truth 1, infer 1\n",
      "index 587, truth 1, infer 1\n",
      "index 588, truth 1, infer 1\n",
      "index 589, truth 1, infer 1\n",
      "index 590, truth 1, infer 1\n",
      "index 591, truth 1, infer 1\n",
      "index 592, truth 1, infer 1\n",
      "index 593, truth 1, infer 1\n",
      "index 594, truth 1, infer 1\n",
      "index 595, truth 1, infer 1\n",
      "index 596, truth 1, infer 1\n",
      "index 597, truth 1, infer 1\n",
      "index 598, truth 1, infer 1\n",
      "index 599, truth 1, infer 1\n",
      "index 600, truth 1, infer 1\n",
      "index 601, truth 1, infer 1\n",
      "index 602, truth 1, infer 1\n",
      "index 603, truth 1, infer 1\n",
      "index 604, truth 1, infer 1\n",
      "index 605, truth 1, infer 1\n",
      "index 606, truth 1, infer 1\n",
      "index 607, truth 1, infer 1\n",
      "index 608, truth 1, infer 1\n",
      "index 609, truth 1, infer 1\n",
      "index 610, truth 1, infer 1\n",
      "index 611, truth 1, infer 1\n",
      "index 612, truth 1, infer 1\n",
      "index 613, truth 1, infer 1\n",
      "index 614, truth 1, infer 1\n",
      "index 615, truth 1, infer 1\n",
      "index 616, truth 1, infer 1\n",
      "index 617, truth 1, infer 1\n",
      "index 618, truth 1, infer 1\n",
      "index 619, truth 1, infer 1\n",
      "index 620, truth 1, infer 1\n",
      "index 621, truth 1, infer 1\n",
      "index 622, truth 1, infer 1\n",
      "index 623, truth 1, infer 1\n",
      "index 624, truth 1, infer 1\n",
      "index 625, truth 1, infer 1\n",
      "index 626, truth 1, infer 1\n",
      "index 627, truth 1, infer 1\n",
      "index 628, truth 1, infer 1\n",
      "index 629, truth 1, infer 1\n",
      "index 630, truth 1, infer 1\n",
      "index 631, truth 1, infer 1\n",
      "index 632, truth 1, infer 1\n",
      "index 633, truth 1, infer 1\n",
      "index 634, truth 1, infer 1\n",
      "index 635, truth 1, infer 1\n",
      "index 636, truth 1, infer 1\n",
      "index 637, truth 1, infer 1\n",
      "index 638, truth 1, infer 1\n",
      "index 639, truth 1, infer 1\n",
      "index 640, truth 1, infer 1\n",
      "index 641, truth 1, infer 1\n",
      "index 642, truth 1, infer 1\n",
      "index 643, truth 1, infer 1\n",
      "index 644, truth 1, infer 1\n",
      "index 645, truth 1, infer 1\n",
      "index 646, truth 1, infer 1\n",
      "index 647, truth 1, infer 1\n",
      "index 648, truth 1, infer 1\n",
      "index 649, truth 1, infer 1\n",
      "index 650, truth 1, infer 1\n",
      "index 651, truth 1, infer 1\n",
      "index 652, truth 1, infer 1\n",
      "index 653, truth 1, infer 1\n",
      "index 654, truth 1, infer 1\n",
      "index 655, truth 1, infer 1\n",
      "index 656, truth 1, infer 1\n",
      "index 657, truth 1, infer 1\n",
      "index 658, truth 1, infer 1\n",
      "index 659, truth 1, infer 1\n",
      "index 660, truth 1, infer 1\n",
      "index 661, truth 1, infer 1\n",
      "index 662, truth 1, infer 1\n",
      "index 663, truth 1, infer 1\n",
      "index 664, truth 1, infer 1\n",
      "index 665, truth 1, infer 1\n",
      "index 666, truth 1, infer 1\n",
      "index 667, truth 1, infer 1\n",
      "index 668, truth 1, infer 1\n",
      "index 669, truth 1, infer 1\n",
      "index 670, truth 1, infer 1\n",
      "index 671, truth 1, infer 1\n",
      "index 672, truth 1, infer 1\n",
      "index 673, truth 1, infer 1\n",
      "index 674, truth 1, infer 1\n",
      "index 675, truth 1, infer 1\n",
      "index 676, truth 1, infer 1\n",
      "index 677, truth 1, infer 1\n",
      "index 678, truth 1, infer 1\n",
      "index 679, truth 1, infer 1\n",
      "index 680, truth 1, infer 1\n",
      "index 681, truth 1, infer 1\n",
      "index 682, truth 1, infer 1\n",
      "index 683, truth 1, infer 1\n",
      "index 684, truth 1, infer 1\n",
      "index 685, truth 1, infer 1\n",
      "index 686, truth 1, infer 1\n",
      "index 687, truth 1, infer 1\n",
      "index 688, truth 1, infer 1\n",
      "index 689, truth 1, infer 1\n",
      "index 690, truth 1, infer 1\n",
      "index 691, truth 1, infer 1\n",
      "index 692, truth 1, infer 1\n",
      "index 693, truth 1, infer 1\n",
      "index 694, truth 1, infer 1\n",
      "index 695, truth 1, infer 1\n",
      "index 696, truth 1, infer 1\n",
      "index 697, truth 1, infer 1\n",
      "index 698, truth 1, infer 1\n",
      "index 699, truth 1, infer 1\n",
      "index 700, truth 1, infer 1\n",
      "index 701, truth 1, infer 1\n",
      "index 702, truth 1, infer 0\n",
      "index 703, truth 1, infer 1\n",
      "index 704, truth 1, infer 0\n",
      "index 705, truth 1, infer 1\n",
      "index 706, truth 1, infer 1\n",
      "index 707, truth 1, infer 1\n",
      "index 708, truth 1, infer 1\n",
      "index 709, truth 1, infer 1\n",
      "index 710, truth 1, infer 0\n",
      "index 711, truth 1, infer 0\n",
      "index 712, truth 1, infer 0\n",
      "index 713, truth 1, infer 1\n",
      "index 714, truth 1, infer 1\n",
      "index 715, truth 1, infer 0\n",
      "index 716, truth 1, infer 0\n",
      "index 717, truth 1, infer 1\n",
      "index 718, truth 1, infer 1\n",
      "index 719, truth 1, infer 1\n",
      "index 720, truth 1, infer 0\n",
      "index 721, truth 1, infer 1\n",
      "index 722, truth 1, infer 0\n",
      "index 723, truth 1, infer 1\n",
      "index 724, truth 1, infer 1\n",
      "index 725, truth 1, infer 0\n",
      "index 726, truth 1, infer 1\n",
      "index 727, truth 1, infer 1\n",
      "index 728, truth 1, infer 0\n",
      "index 729, truth 1, infer 0\n",
      "index 730, truth 1, infer 1\n",
      "index 731, truth 1, infer 0\n",
      "index 732, truth 1, infer 0\n",
      "index 733, truth 1, infer 1\n",
      "index 734, truth 1, infer 0\n",
      "index 735, truth 1, infer 0\n",
      "index 736, truth 1, infer 1\n",
      "index 737, truth 1, infer 0\n",
      "index 738, truth 1, infer 0\n",
      "index 739, truth 1, infer 1\n",
      "index 740, truth 1, infer 1\n",
      "index 741, truth 1, infer 1\n",
      "index 742, truth 1, infer 0\n",
      "index 743, truth 1, infer 1\n",
      "index 744, truth 1, infer 0\n",
      "index 745, truth 1, infer 0\n",
      "index 746, truth 1, infer 0\n",
      "index 747, truth 1, infer 0\n",
      "index 748, truth 1, infer 0\n",
      "index 749, truth 1, infer 1\n",
      "index 750, truth 1, infer 1\n",
      "index 751, truth 1, infer 0\n",
      "index 752, truth 1, infer 1\n",
      "index 753, truth 1, infer 0\n",
      "index 754, truth 1, infer 1\n",
      "index 755, truth 1, infer 1\n",
      "index 756, truth 1, infer 0\n",
      "index 757, truth 1, infer 0\n",
      "index 758, truth 1, infer 0\n",
      "index 759, truth 1, infer 0\n",
      "index 760, truth 1, infer 0\n",
      "index 761, truth 1, infer 0\n",
      "index 762, truth 1, infer 0\n",
      "index 763, truth 1, infer 0\n",
      "index 764, truth 1, infer 1\n",
      "index 765, truth 1, infer 0\n",
      "index 766, truth 1, infer 0\n",
      "index 767, truth 1, infer 1\n",
      "index 768, truth 1, infer 0\n",
      "index 769, truth 1, infer 0\n",
      "index 770, truth 1, infer 1\n",
      "index 771, truth 1, infer 0\n",
      "index 772, truth 1, infer 0\n",
      "index 773, truth 1, infer 1\n",
      "index 774, truth 1, infer 1\n",
      "index 775, truth 1, infer 0\n",
      "index 776, truth 1, infer 1\n",
      "index 777, truth 1, infer 0\n",
      "index 778, truth 1, infer 1\n",
      "index 779, truth 1, infer 1\n",
      "index 780, truth 1, infer 0\n",
      "index 781, truth 1, infer 1\n",
      "index 782, truth 1, infer 1\n",
      "index 783, truth 1, infer 1\n",
      "index 784, truth 1, infer 1\n",
      "index 785, truth 1, infer 1\n",
      "index 786, truth 1, infer 1\n",
      "index 787, truth 1, infer 0\n",
      "index 788, truth 1, infer 0\n",
      "index 789, truth 1, infer 0\n",
      "index 790, truth 1, infer 1\n",
      "index 791, truth 1, infer 1\n",
      "index 792, truth 1, infer 0\n",
      "index 793, truth 1, infer 0\n",
      "index 794, truth 1, infer 0\n",
      "index 795, truth 1, infer 1\n",
      "index 796, truth 1, infer 0\n",
      "index 797, truth 1, infer 0\n",
      "index 798, truth 1, infer 0\n",
      "index 799, truth 1, infer 1\n",
      "index 800, truth 1, infer 0\n",
      "test accuracy 78.0%\n"
     ]
    }
   ],
   "source": [
    "import paddle.fluid as fluid\n",
    "# 模型评估\n",
    "with fluid.dygraph.guard():\n",
    "    # 读取模型\n",
    "    # 参数为保存模型参数的文件地址\n",
    "    model_dict, _ = fluid.load_dygraph('classification')\n",
    "    # 加载模型参数\n",
    "    model.load_dict(model_dict)\n",
    "    #评估模式\n",
    "    model.eval()\n",
    "    \n",
    "    # 读取测试集数据\n",
    "    # data = next(test_reader())\n",
    "    \n",
    "    # 记录预测正确的样本数量\n",
    "    num = 0\n",
    "    # 记录样本序号\n",
    "    index = 0\n",
    "    for batch_id, data in enumerate(test_reader()):\n",
    "        # 调整数据shape使之适合模型\n",
    "        images = np.array([x[0].reshape(DATA_DIM) for x in data],np.float32)\n",
    "        labels = np.array([x[1] for x in data]).astype('int64').reshape(1, -1)[0]\n",
    "        \n",
    "        # 将numpy数据转为飞桨动态图variable形式\n",
    "        image = fluid.dygraph.to_variable(images)\n",
    "        \n",
    "        # 前向计算\n",
    "        predict = model(image)\n",
    "\n",
    "        # 统计预测结果\n",
    "        # 将预测结果转为numpy数据类型\n",
    "        predict = predict.numpy()\n",
    "        predict = np.argmax(predict, axis = 1)\n",
    "        \n",
    "        for index in range(len(predict)):\n",
    "            n += 1\n",
    "            if labels[index] == predict[index]:\n",
    "                m += 1    \n",
    "            print(\"index {}, truth {}, infer {}\".format(n, labels[index], predict[index]))\n",
    "    print(\"test accuracy {}%\".format(m/n*100))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
